题目描述
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
C++代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int w, m, n;
cin >> w >> m >> n;
m --, n --;//序号减1,便于利用公式求行号和列号
int x1 = m / w, x2 = n / w;//行号
int y1 = m % w, y2 = n % w;//求列号
if(x1 & 1) y1 = w - 1 - y1;//特判,是否为奇数行
if(x2 & 1) y2 = w - 1 - y2;
//曼哈顿顿距离
cout << abs(x1 - x2) +abs(y1 - y2) << endl;
return 0;
}
救命
我也,救命
直接一下搞定,如果不是奇偶交替行,就不管,有一个是就直接随便换一个
牛
if(x1 & 1) y1 = w - 1 - y1;//特判,是否为奇数行
if(x2 & 1) y2 = w - 1 - y2;
这个语句怎么理解呀?
同问,有没有大佬回答一下呀
如果前者是奇数的话,它的二进制最后一位肯定是1 ,偶数就是0。&1 就是把最后一位取出。奇数就为真,反之。
因为奇数行的排列是逆向的,通过特判,把逆向变为正向
跟我一样,嘿嘿
啊?
妙啊
救命
只能说妙啊,牛
ORZ
直接合起来搞
y1 = w - 1 - y1;这个是怎么推导出来的
为什么开始m和n都要减一呢
按照下标从0开始计算,所以先减去1,例如想要算一个点的在第几行,那么可以这样算,x1 = (number - 1) / w + 1,再加上一就又回到了下标从1开始算,这是个技巧。
对于正好整除的数,必须特殊处理,如(2,1,10)中,上边求得10的左标为2,0,实际应为1,5
妙啊
厉害,我还直接pair<>模拟 e