欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-01 09:39:47
...
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 + ")";
		}
	}
}