题目描述
X星球居民小区的楼房全是一样的,并且按矩阵样式排列。
其楼房的编号为 1,2,3…
当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为 6 时,开始情形如下:
1 2 3 4 5 6
12 11 10 9 8 7
13 14 15 .....
我们的问题是:已知了两个楼号 m 和 n,需要求出它们之间的最短移动距离(不能斜线方向移动)。
输入格式
输入共一行,包含三个整数 w,m,n,w 为排号宽度,m,n 为待计算的楼号。
输出格式
输出一个整数,表示 m,n 两楼间最短移动距离。
数据范围
$ 1≤w,m,n≤10000, $
输入样例
6 8 2
输出样例
4
数学 $O(1)$
C++ 代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
typedef pair<int, int> PII;
const int N = 1e4 + 10;
int w, m, n;
int a[N];
//得到楼号n在矩阵中的横纵坐标
PII get(int n)
{
PII res;
int t = n / w;
if(n % w == 0) //判断是否在该行的行首或行尾
{
res.first = t;
if(t & 1) res.second = w; //在该行的行尾
else res.second = 1; //在该行的行首
}
else{
res.first = t + 1;
if(res.first & 1) res.second = n % w; //若行号为奇,则从左往右数
else res.second = w - n % w + 1; //若行号为偶,则从右往左数
}
// cout << res.first << ' ' << res.second << endl;
return res;
}
int main()
{
scanf("%d%d%d", &w, &m, &n);
PII m_xy = get(m);
PII n_xy = get(n);
printf("%d\n", abs(m_xy.first - n_xy.first) + abs(m_xy.second - n_xy.second));
return 0;
}