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
*/
方法一:(思维简单,但比较麻烦,执行速度慢)
package 蓝桥; import java.util.Scanner; public class lou { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int tamp=scanner.nextInt(); int n,m,sum=0; n=scanner.nextInt(); m=scanner.nextInt(); int[][] a=new int[10000/tamp+10][tamp]; int x=-1,y=0,o=1; for (int i = 1; i <= 10000; i++) { x+=o; //System.out.println(y+" "+x); a[y][x]=i; if((x==0||x==tamp-1)&&i!=1) { o=-o; y++; i++; //System.out.println(y+" "+x); a[y][x]=i; } } x=y=-99; int x2=-99,y2=-99; for (int i = 0; i < ((10000/tamp)+1); i++) { for (int j = 0; j <tamp ; j++) { if (a[i][j]==n) { x=i; y=j; break; } } if (x!=-99&&y!=-99) { break; } } for (int i = 0; i < ((10000/tamp)+1); i++) { for (int j = 0; j <tamp ; j++) { if (a[i][j]==m) { x2=i; y2=j; break; } } if (x2!=-99&&y2!=-99) { break; } } sum=Math.abs(x-x2)+Math.abs(y-y2); System.out.println(sum); } }
方法二:(找规律,速度快)
package 蓝桥; import java.util.Scanner; public class lou { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int tamp=scanner.nextInt(); int n,m,sum=0; n=scanner.nextInt(); m=scanner.nextInt(); sum+=Math.abs((n+tamp-1)/tamp-(m+tamp-1)/tamp); int x=(n%tamp); int y=(m%tamp); if (((n+tamp-1)/tamp)%2==0&&x!=0) { x=tamp-x+1; } else if (x==0) { x=1; } if (((m+tamp-1)/tamp)%2==0&&y!=0) { y=tamp-y+1; } else if (y==0) { y=1; } sum+=Math.abs(x-y); System.out.println(sum); } }