[问题描述]
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 两楼间最短移动距离。
分析:做这个题目,这恶鬼小区的排号为一个n阶矩阵,所以我们要写出一个矩阵,如果从0行开始奇数行就为降序排列,写完矩阵,我们就可以根据下标求差取绝对值相加最后得出移动距离。
public class Main {
public static void main(String[] args) {
Scanner sr = new Scanner(System.in);
int n = sr.nextInt();
int m = sr.nextInt();
int z = sr.nextInt();
System.out.println(JuZhen(n, m, z));
}
static int JuZhen(int n, int m, int z) {
int flag = 0;
int e = 0, r = 0, t = 0, y = 0;
int[][] arr = new int[n][n];
for (int i = 0; i < arr.length; i++) {
if (i == 1 || i % 2 != 0) {
int a = flag;// a=3
a += n;// a=6
for (int k = 0; k < arr.length; k++) {
arr[i][k] = a--;
if (arr[i][k] == m || arr[i][k] == z) {
e = i;
r = k;
}
// System.out.print(arr[i][k]+" ");
}
// System.out.println();
flag = a + n;// flag=6
} else {
for (int j = 0; j < arr.length; j++) {
arr[i][j] = ++flag;
if (arr[i][j] == m || arr[i][j] == z) {
t = i;
y = j;
}
// System.out.print(arr[i][j]+" ");
}
// System.out.println();
}
}
int index1 = e - t;
int index2 = r - y;
return Math.abs(index1) + Math.abs(index2);
}
}