题解|二维矩阵最短路径

[问题描述]
X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3…
当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为6时,开始情形如下:
1 2 3 4 5 6
12 11 10 9 8 7
13 14 15 …

我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动) 输入为3个整数w m n,空格分开,都在1到10000范围内 要求输出一个整数,表示m n 两楼间最短移动距离。
[样例输入]
6 8 2
[样例输出]
4

思路

1.二维数组的生成:

  • 1.1 生成多少行由max(m,n)与w共同决定 (例如:max(m,n) = 10,因为10.0 / w的值大于1小于2,所以二维数组共有2行。)

  • 1.2 注意偶数行的反向填充

2.假设两个点(x1,y1)与(x2,y2),则距离d = |x2-x1| + |y2 - y1|

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			// 记录两个点的横纵坐标
			int[][] positionArr = new int[2][2];
			int w = sc.nextInt();
			int m = sc.nextInt();
			int n = sc.nextInt();
			// 设m>n
			if (m < n) {
				int temp = m;
				m = n;
				n = temp;
			}
			// 确定二维数组的行数
			int r;
			double temp = m * 1.0 / w;
			if (temp == m / w) {
				r = m / w;
			} else {
				r = m / w + 1;
			}
			// 建立二维数组
			int[][] arr = new int[r][w];
			int x = 1;
			for (int i = 0; i < arr.length; i++) {
				// 反打
				if (i % 2 != 0) {
					for (int j = arr[i].length - 1; j >= 0; j--) {
						arr[i][j] = x;
						x++;
					}
				} else {
					for (int j = 0; j < arr[i].length; j++) {
						arr[i][j] = x;
						x++;
					}
				}
			}
			// 数组建立完成
			// 计算distance
			for (int i = 0; i < arr.length; i++) {
				for (int j = 0; j < arr[i].length; j++) {
					if (arr[i][j] == n) {
						positionArr[0][0] = i;
						positionArr[0][1] = j;
					}
					if (arr[i][j] == m) {
						positionArr[0][1] = i;
						positionArr[1][1] = j;
					}
				}
			}
			int d1 = positionArr[0][1] - positionArr[0][0];
			if (d1 < 0) {
				d1 = -d1;
			}
			int d2 = positionArr[1][1] - positionArr[0][1];
			if (d2 < 0) {
				d2 = -d2;
			}
			System.out.println(d1 + d2);
		}
	}

}

猜你喜欢

转载自blog.csdn.net/a739260008/article/details/86487345