[问题描述]
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 class MyAnswer {
public static void main(String[] args) {
int w;
int m;
int n;
int m_hang=0;
int m_lie;
int n_hang=0;
int n_lie;
Scanner sc=new Scanner(System.in);
w=sc.nextInt();m=sc.nextInt();n=sc.nextInt();
//m小,n大
if(m>n) {
int x=m;
m=n;
n=x;
}
//判断m在第几行
int i=1;
Boolean b=true;
while(b) {
if(w*i>=m) {
m_hang=i;
b=false;
}else {
i++;
}
}
if(m_hang%2==0) {
if(m%w!=0)
m_lie=w-(m%w)+1;
else
m_lie=1;
}else {
m_lie=m%w;
if(m_lie==0) {
m_lie=w;
}
}
System.out.println(m_hang+" "+m_lie+" ");
//判断n第几行
b=true;
while(b) {
if(w*i>=n) {
n_hang=i;
b=false;
}else {
i++;
}
}
if(n_hang%2==0) {
if(n%w!=0)
n_lie=w-(n%w)+1;
else
n_lie=1;
}else {
n_lie=n%w;
if(n_lie==0) {
n_lie=w;
}
}
System.out.println(n_hang+" "+n_lie+" ");
int distance_hang=n_hang-m_hang;
int distance_lie=n_lie-m_lie;
if(distance_lie<0) {
distance_lie=-distance_lie;
}
System.out.println(distance_hang+" "+distance_lie+" ");
System.out.println(distance_hang+distance_lie);
}
}
本题的思路很清晰,只要把距离分成行距离和列距离即可。但是在做的时候,需要注意很多:
1.在判断行的时候,第一行的条件必须考虑。本人一开始的判断语句,直接跳过了第一行。
2.在判断列的时候,需要注意,取余为0的情况要单独列出来。同时在两列相减的时候,需要+1。
[更好答案]
import java.util.Scanner;
public class Answer {
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 bigger = Integer.max(m, n);
int smaller = Integer.min(m, n);
int r1 = bigger % w == 0 ? (bigger / w - 1) : bigger / w;//大数的行号
int c1;//计算列号
if ((r1 & 1) == 1) {//第偶数行,顺着走
c1 = (w - bigger % w) % w;
} else {//奇数行
c1 = (bigger % w - 1 + w) % w;
}
int r2 = smaller % w == 0 ? (smaller / w - 1) : smaller / w;//小数的行号
int c2;
if ((r2 & 1) == 1) {//第偶数行,顺着走
c2 = (w - smaller % w) % w;
} else {//奇数行
c2 = (smaller % w - 1 + w) % w;
}
System.out.println(Math.abs(r1 - r2) + Math.abs(c1 - c2));
}
}
别人的答案里面,写的比我的简洁,思路是一样的。优化点有一下三点:
1.在判断行的时候,他直接用了三元运算,很简洁。
2.比较m和n的大小时,直接使用了函数max和min。
3.最终取绝对值,他用了abs函数。