我的博客:https://blog.youkuaiyun.com/txb116424
学习资料和练习题目地址: http://dasai.lanqiao.cn/pages/dasai/news_detail_w.html?id=644
[问题描述]
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
*/
import java.util.Scanner;
public class MinDistance1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (true) {
int w = in.nextInt();
int m = in.nextInt();
int n = in.nextInt();
get_coordinates(w, m, n);
}
}
// 输出坐标差值(两楼距离)
public static void get_coordinates(int w, int m, int n) {
int x1 = hang(w, m);
int x2 = hang(w, n);
int y1 = lie(w, m);
int y2 = lie(w, n);
// Math.abs()返回一个数的绝对值
System.out.println(Math.abs(x1 - x2) + Math.abs(y1 - y2));
}
// 获取横坐标
public static int hang(int w, int a) {
int x, y;
x = (a - 1) / w + 1;
return x;
}
// 获取纵坐标
public static int lie(int w, int a) {
int x, y;
x = (a - 1) / w + 1;
y = a % w;
if (y == 0)
y = w;
if (x % 2 == 0) // 双数行是逆序
y = w - y + 1;
return y;
}
}