import java.util.Arrays;
import java.util.Random;
import java.util.Stack;
/**
* 创建一个二维数组,每一个元素是一个正数。<br>
* 进行走位,路线是从数组左上角走到右下角。<br>
* 每次只能向右或向下走。<br>
* 不能走出矩阵。<br>
* 走一步就会加上当前数组中元素的数据。<br>
* 求路线,使得和最小。
*
* @author 刘胜军
*/
public class Seven {
public static void main(String[] args) {
/********************************************/
int[][] num = getMiGong();// 获取迷宫
Stack<Object[]> end = new Stack<Object[]>();// 保存所有通路栈
Stack<Position> temp = new Stack<Position>();// 保存当前走过的路的坐标的栈
new Seven().getRu(0, 0, num.length - 1, num[0].length - 1, temp, end);// 计算
/**************** 打印所有通路 ******************/
for (Object[] obj : end) {
System.out.println(Arrays.toString(obj));
}
/***************** 获取最小值 ******************/
int index_i = 0;// 当前最小值的下标
int index_sum = Integer.MAX_VALUE;// 记录当前最小值
for (int i = 0; i < end.size(); i++) {
int size = 0;
for (Object object : end.get(i)) {
size += num[((Position) object).row][((Position) object).col];
}
if (size <= index_sum) {
index_i = i;
index_sum = size;
}
}
System.out.println("最小权值为:" + index_sum);
System.out.println("最小权值坐标为:" + Arrays.toString(end.get(index_i)));
/********************************************/
}
/**
* 获取矩阵
*
* @return
*/
public static int[][] getMiGong() {
int x = new Random().nextInt(9) + 1;
int y = new Random().nextInt(9) + 1;
int[][] num = new int[x][y];
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
num[i][j] = new Random().nextInt(100);
}
}
// int[][] num = { { 1, 1, 1, 1, 1 },
// int[][] num = { { 1, 0, 1, 1, 1 }, { 1, 0, 1, 1, 1 },
// { 1, 0, 0, 0, 1 }, { 1, 1, 0, 0, 1 }, { 1, 1, 1, 1, 1 } };
// int[][] num = { { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
// { 1, 0, 0, 0, 0, 0, 0, 0, 1 }, { 1, 0, 1, 1, 0, 1, 1, 0, 1 },
// { 1, 0, 1, 0, 0, 1, 0, 0, 1 }, { 1, 0, 1, 0, 1, 0, 1, 0, 1 },
// { 1, 0, 0, 0, 0, 0, 1, 0, 1 }, { 1, 1, 0, 1, 1, 0, 1, 1, 1 },
// { 1, 0, 0, 0, 0, 0, 0, 0, 1 } };
return num;
}
/**
* 计算所有通路
*
* @param start_x
* 开始坐标x
* @param start_y
* 开始坐标y
* @param end_x
* 结束坐标x
* @param end_y
* 结束坐标y
* @param temp
* 保存当前走过的路的栈
* @param end
* 保存通路的栈
*/
public void getRu(int start_x, int start_y, int end_x, int end_y,
Stack<Position> temp, Stack<Object[]> end) {
temp.push(new Position(start_x, start_y));// 当前点入栈
if (start_x == end_x && start_y == end_y) {// 判断当前点是不是结束点
end.push(temp.toArray());// 如果是,说明当前是一条通路,这个时候保存当前通路保存到通路的栈中
temp.pop();// 当前点出栈
return;// 返回上一个点(最后一个点的话,退出当前方法)
}
if (start_x + 1 <= end_x)
getRu(start_x + 1, start_y, end_x, end_y, temp, end);
if (start_y + 1 <= end_y)
getRu(start_x, start_y + 1, end_x, end_y, temp, end);
temp.pop();// 当前点出栈
return;// 返回上一个点(最后一个点的话,退出当前方法)
}
/**
* 自定义点坐标
*
* @author 刘胜军
*/
class Position {
public int row;
public int col;
public Position(int row, int col) {
this.row = row;
this.col = col;
}
public int getRow() {
return row;
}
public int getCol() {
return col;
}
@Override
public String toString() {
return "(" + row + "," + col + ")";
}
}
}
分享到:
相关推荐
我们可以创建一个优先级队列,每次取出最小(或最大)的元素,但比较规则是基于行索引和列索引的组合,使得元素按逆时针顺序出队。 下面是使用迭代方法实现的示例代码(ArraySort.java): ```java import java....
二维数组的堆排序是计算机科学中的一个重要概念,特别是在数据结构和算法的学习中。在Java编程中,处理二维数组并对其进行排序是一项常见的任务。本篇文章将深入探讨如何利用堆排序算法对二维数组进行排序,以及如何...
综上所述,这个"二维选择排序"项目提供了一个对二维数组进行排序的实现,对于理解和学习排序算法以及C#的数组操作有一定的帮助。不过,实际开发中,开发者应根据具体需求和性能要求选择合适的排序算法。
创建三维数组可以使用`zeros`、`ones`或`rand`等函数,如`X = zeros(10, 20, 30)`将创建一个10x20x30的全零三维数组。 三维重建是计算机视觉和图像处理中的重要任务,主要目的是通过多个二维图像重建出物体的三维...
邻接矩阵是一个二维数组,对于无向图而言,数组中的元素\[A\_{ij}\]表示第\(i\)个顶点到第\(j\)个顶点的边的权重;若顶点\(i\)与顶点\(j\)之间不存在边,则该值通常被设为无穷大或一个足够大的值(在这个例子中使用...
例如,声明一个二维数组可以用 `Dim arrTemp(1 to 3, 1 to 5) As Integer`。对于多维数组的理解,可以参考“节点理论”,即多维数组中的每个维度都可以看作是一个“节点”或“层”。 #### 三、数组调试技巧 - 使用...
# 创建一个二维数组 matrix = np.array([[3, 1, 4], [1, 5, 9], [2, 6, 5]]) # 按列排序 sorted_matrix = matrix.copy() sorted_matrix.sort(axis=1) print("Original Matrix:\n", matrix) print("Sorted Matrix ...
例如,`np.array([1,2,3])`创建一个一维数组,而`np.array([[1, 2], [3, 4]])`则创建一个二维数组。 Numpy还提供了创建特殊元素数组的功能,如`numpy.zeros()`, `numpy.ones()`, `numpy.empty()`和`numpy.eye()`。...
1. 输入数据:首先,你需要将多目标的数据存储在一个二维数组中,每一行代表一个目标的一个点,列分别对应x和y坐标。 2. 计算边界:找出点集的最小x、最大x、最小y和最大y坐标。 3. 初始化矩形:创建一个初始矩形,...
1. **初始化**:创建一个二维数组`dis`,用于存储任意两点间的最短距离;创建另一个二维数组`rout`,用于记录路径。 2. **更新路径**:通过三层循环遍历图中的所有节点,利用中间节点`k`尝试更新从`i`到`j`的最短...
实现时,通常需要设置一个二维数组,并通过双层循环来计算每个位置的值。外层循环控制行数,内层循环负责计算当前行每个位置的值。杨辉三角形的实现不仅涉及到二维数组的使用,还能够帮助学习者理解和掌握递归关系在...
2. **创建二维数组**:对于每个像素位置,根据其灰度值构建一个二维矩阵。 3. **绘制直方图**:使用`imagesc`或`pcolor`函数来绘制二维直方图。 例如,如果需要绘制一幅图像中红色通道和绿色通道的二维直方图,可以...
邻接矩阵是一个二维数组,其中的每个元素表示两个顶点之间是否存在边以及边的权重。邻接表是一种更节省空间的数据结构,它为每个顶点存储一个链表,链表中的每个元素表示一条以该顶点为起点的边及其权重。 2. 使用...
对于三角形最小路径和,我们定义一个二维数组 `dp`,其中 `dp[i][j]` 表示到达三角形第 `i` 行第 `j` 列的最小路径和。初始状态设置为 `dp[0][0] = triangle[0][0]`,因为只有一条路径可选。然后,我们可以从第二行...
在Java中,我们可以创建一个二维数组来表示邻接矩阵,其中的元素代表边的权重。然后,我们可以实现Prim算法的核心逻辑,包括初始化状态(例如,将起始节点标记为已访问,其他节点为未访问),并用循环结构进行迭代,...
1. **初始化数据**: 首先定义了一个二维数组 `array` 来存储 12 个三维坐标点,并将每个点的 x 值设置为 1。这意味着所有点都位于 \(x=1\) 的平面上。 2. **构建系数矩阵**: - 创建两个三维数组 `Matrix` 和 `I...
在本资源中,我们关注的是一个使用C语言实现的线性求解器,它使得创建二维数组以及求解相关的线性方程组变得简单。线性方程组是数学中的基本概念,通常用矩阵的形式表示,它在各种工程、科学和经济领域中都有广泛的...
邻接矩阵是一个二维数组,每个元素表示一对节点之间是否存在边及边的权重;邻接表则更节省空间,它为每个节点维护一个链表,链表中的每个元素表示与其相连的节点和边的权重。 对于GUI部分,我们可以使用Windows ...
接下来,我们需要定义数据结构来存储这些数据点,例如创建一个二维数组或自定义类来保存每个点的x和y坐标。 然后,我们需要实现计算残差平方和的函数。这通常涉及到遍历数据点,计算每个点与拟合线之间的距离,并将...
1. 掌握一维数组和二维数组的定义及初始化。数组是Java中存储同类型数据集合的重要方式,一维数组可看作线性结构,而二维数组则类似表格结构,用于表示矩阵或其他二维数据。 2. 学习并应用`java.lang.Math`类的`...