`

创建一个二维数组,求路线,使得和最小

阅读更多
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 + ")";
		}
	}
}
分享到:
评论

相关推荐

    java 将二维数组顺时针,逆时针排序

    我们可以创建一个优先级队列,每次取出最小(或最大)的元素,但比较规则是基于行索引和列索引的组合,使得元素按逆时针顺序出队。 下面是使用迭代方法实现的示例代码(ArraySort.java): ```java import java....

    二维数组的堆排序

    二维数组的堆排序是计算机科学中的一个重要概念,特别是在数据结构和算法的学习中。在Java编程中,处理二维数组并对其进行排序是一项常见的任务。本篇文章将深入探讨如何利用堆排序算法对二维数组进行排序,以及如何...

    二维排序算法 选择排序 C#二维数组实现

    综上所述,这个"二维选择排序"项目提供了一个对二维数组进行排序的实现,对于理解和学习排序算法以及C#的数组操作有一定的帮助。不过,实际开发中,开发者应根据具体需求和性能要求选择合适的排序算法。

    三维数组 matlab -三维重建中涑调整的步骤

    创建三维数组可以使用`zeros`、`ones`或`rand`等函数,如`X = zeros(10, 20, 30)`将创建一个10x20x30的全零三维数组。 三维重建是计算机视觉和图像处理中的重要任务,主要目的是通过多个二维图像重建出物体的三维...

    数据结构——图的最小生成树(邻接矩阵、普利姆)

    邻接矩阵是一个二维数组,对于无向图而言,数组中的元素\[A\_{ij}\]表示第\(i\)个顶点到第\(j\)个顶点的边的权重;若顶点\(i\)与顶点\(j\)之间不存在边,则该值通常被设为无穷大或一个足够大的值(在这个例子中使用...

    VBA数组进阶

    例如,声明一个二维数组可以用 `Dim arrTemp(1 to 3, 1 to 5) As Integer`。对于多维数组的理解,可以参考“节点理论”,即多维数组中的每个维度都可以看作是一个“节点”或“层”。 #### 三、数组调试技巧 - 使用...

    Python数据分析应用:数组排序.pptx

    # 创建一个二维数组 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 ...

    第13章 python数据分析之Numpy库的使用-python数据分析,进阶.pptx

    例如,`np.array([1,2,3])`创建一个一维数组,而`np.array([[1, 2], [3, 4]])`则创建一个二维数组。 Numpy还提供了创建特殊元素数组的功能,如`numpy.zeros()`, `numpy.ones()`, `numpy.empty()`和`numpy.eye()`。...

    matlab 求最小外接矩形

    1. 输入数据:首先,你需要将多目标的数据存储在一个二维数组中,每一行代表一个目标的一个点,列分别对应x和y坐标。 2. 计算边界:找出点集的最小x、最大x、最小y和最大y坐标。 3. 初始化矩形:创建一个初始矩形,...

    FLoyd求最小环模板(有注释)(c++/c 语言)

    1. **初始化**:创建一个二维数组`dis`,用于存储任意两点间的最短距离;创建另一个二维数组`rout`,用于记录路径。 2. **更新路径**:通过三层循环遍历图中的所有节点,利用中间节点`k`尝试更新从`i`到`j`的最短...

    (完整word版)C语言必背的典型程序设计题目-数组、函数-参考答案.doc

    实现时,通常需要设置一个二维数组,并通过双层循环来计算每个位置的值。外层循环控制行数,内层循环负责计算当前行每个位置的值。杨辉三角形的实现不仅涉及到二维数组的使用,还能够帮助学习者理解和掌握递归关系在...

    matlab画图像的二维直方图-matlab画图像的二维直方图.doc

    2. **创建二维数组**:对于每个像素位置,根据其灰度值构建一个二维矩阵。 3. **绘制直方图**:使用`imagesc`或`pcolor`函数来绘制二维直方图。 例如,如果需要绘制一幅图像中红色通道和绿色通道的二维直方图,可以...

    Kruskal算法求最小生成树问题_matlab_生成树问题_

    邻接矩阵是一个二维数组,其中的每个元素表示两个顶点之间是否存在边以及边的权重。邻接表是一种更节省空间的数据结构,它为每个顶点存储一个链表,链表中的每个元素表示一条以该顶点为起点的边及其权重。 2. 使用...

    php-leetcode题解之三角形最小路径和.zip

    对于三角形最小路径和,我们定义一个二维数组 `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 代码 实现线性求解器,使其易于创建 双维数组并求解相关的线性系统.rar

    在本资源中,我们关注的是一个使用C语言实现的线性求解器,它使得创建二维数组以及求解相关的线性方程组变得简单。线性方程组是数学中的基本概念,通常用矩阵的形式表示,它在各种工程、科学和经济领域中都有广泛的...

    C#实现最小生成树

    邻接矩阵是一个二维数组,每个元素表示一对节点之间是否存在边及边的权重;邻接表则更节省空间,它为每个节点维护一个链表,链表中的每个元素表示与其相连的节点和边的权重。 对于GUI部分,我们可以使用Windows ...

    最小二乘拟合的vb实现

    接下来,我们需要定义数据结构来存储这些数据点,例如创建一个二维数组或自定义类来保存每个点的x和y坐标。 然后,我们需要实现计算残差平方和的函数。这通常涉及到遍历数据点,计算每个点与拟合线之间的距离,并将...

    实验3 方法和数组.doc

    1. 掌握一维数组和二维数组的定义及初始化。数组是Java中存储同类型数据集合的重要方式,一维数组可看作线性结构,而二维数组则类似表格结构,用于表示矩阵或其他二维数据。 2. 学习并应用`java.lang.Math`类的`...

Global site tag (gtag.js) - Google Analytics