题目
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
再例如:
用户输入4 7 20
程序输出
5
答案
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int w = sc.nextInt();
int m = sc.nextInt();
int n = sc.nextInt();
int row = 10000 % w == 0 ? 10000 / w : (10000 / w) + 1;
row = row % 2 == 0 ? row : row + 1;
//由于我的生成数组的方式是两行两行生成,在总行数为单数的请况下可能出现错误,这里没有改进,而是选择了多生成一行来解决
//可以使用一个布尔值来控制数组是正向还是反向,生成完一行后使该布尔值取非即可
//没有必要让数组生成到10000,可以根据m和n中大的那个值来判断应该生成到多少
int[][] nums = new int[row][w];
//初始化
int a = 1;
for (int i = 0; i < nums.length - 1; i += 2) {
//单数
for (int j = 0; j < nums[i].length; j++) {
nums[i][j] = a++;
}
//双数,反向遍历
for (int k = w - 1; k >= 0; k--) {
nums[i + 1][k] = a++;
}
}
for (int i = 0; i < nums.length; i++) {
System.out.println(Arrays.toString(nums[i]));
}
//将m和n的坐标获取出来
int[] w_m = new int[2];
int[] w_n = new int[2];
boolean flag_1 = false;
boolean flag_2 = false;
l:
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums[i].length; j++) {
//两个值都找到即退出
if (flag_1 && flag_2) {
break l;
}
if (nums[i][j] == m) {
flag_1 = true;
w_m[0] = i;
w_m[1] = j;
}
if (nums[i][j] == n) {
flag_2 = true;
w_n[0] = i;
w_n[1] = j;
}
}
}
//横坐标差的绝对值加上纵坐标差的绝对值即为答案
int result = (Math.abs(w_m[0] - w_n[0])) + (Math.abs(w_m[1] - w_n[1]));
System.out.println(result);
}