X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3……
当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为6时,开始情形如下:
1 2 3 4 5 6
12 11 10 9 8 7
13 14 15 16 17……
我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)
输入为3个整数w m n,空格分开,都在1到10000范围内
要求输出一个整数,表示m n 两楼间最短移动距离。
构思:因为不能斜线方向移动,所以我们可以引用平面直角坐标系的思想,找到两个楼在这个小区的坐标,横坐标与纵坐标相减最终相加,自然可以得到两点之间的“最短路径”。这样只要解决了二维数组的排序问题,这个问题就迎刃而解了。
public class Test2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int row = input.nextInt();//line为小区楼的列数
int n = input.nextInt();//n为用户输入的第一个楼的编号
int m = input.nextInt();//m为用户输入的第二个楼的编号
//求出最大的行数用来创建数组
int line = (int)(10000/row);
//创建数组
int lou [][] = new int [line][row];
buildingInit(lou);
System.out.println(Result(lou,n,m));
}
//对小区的楼房进行初始化,将数据初始化
public static void buildingInit(int lou [][]){
int count = 1;
for (int i = 0; i < lou.length; i++) {
if (i%2==1) {//行数为单数的进行正向赋值
for (int j = 0; j < lou[i].length; j++) {
lou[i][j]=count;
count++;
}
}else {//行数为偶数倍的时候反方向赋值
for (int j = lou[i].length-1; j >= 0; j--) {
lou[i][j]=count;
count++;
}
}
}
}
//分析两个点的所在位置,获取他的位置值(坐标值)
public static int Result(int lou[][],int n,int m){
int a=0,b=0;//n点坐标
int x=0,y=0;//m点坐标
int num1,num2,sum;//结果值
for (int i = 0; i < lou.length; i++) {
for (int j = 0; j < lou[0].length; j++) {
if (lou[i][j]==n) {
a=i;
b=j;
}
if (lou[i][j]==m) {
x=i;
y=j;
}
}
}
//对两个坐标进行运算
//n(a,b) m(x,y)
if(a>x){
num1 = a-x;
}else {
num1 = x-a;
}
if (b>y) {
num2 = b-y;
}else {
num2 = y-b;
}
sum = num1+num2;
return sum;
}
}