[问题描述]
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);
}
}
}