移动距离
题目描述
核心思路
这题其实就是想让我们求出编号为 m m m的楼房与编号为 n n n的楼房的曼哈顿距离。设编号为 m m m的楼房的二维坐标是 ( x 1 , y 1 ) (x_1,y_1) (x1,y1),编号为 n n n的楼房的二维坐标是 ( x 2 , y 2 ) (x_2,y_2) (x2,y2),那么曼哈顿距离为 ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ |x_1-x_2|+|y_1-y_2| ∣x1−x2∣+∣y1−y2∣。
因为楼房的编号从1,开始,但是为了适应二维数组,为了更方便的求出某个编号楼房的坐标,我们先让楼房的编号都减去1。拿样例来解释,如果楼房的编号从1开始,那么编号为2的坐标是 ( 1 , 2 ) (1,2) (1,2),编号为8的坐标为 ( 2 , 5 ) (2,5) (2,5),因此曼哈顿距离就是 ∣ 1 − 2 ∣ + ∣ 2 − 5 ∣ = 4 |1-2|+|2-5|=4 ∣1−2∣+∣2−5∣=4;如果让楼房的编号从0开始,那么编号为2的坐标是 ( 0 , 1 ) (0,1) (0,1),编号为8的坐标为 ( 1 , 4 ) (1,4) (1,4),因此曼哈顿距离就是 ∣ 0 − 1 ∣ + ∣ 1 − 4 ∣ = 4 |0-1|+|1-4|=4 ∣0−1∣+∣1−4∣=4,可以知道,编号减去1后结果仍然不变,但是会结合二维数组会更好的求出行号和列号。
问题:如何求出某个点的行号,也就是横坐标呢?
问题:如何求出某个点的列号,也就是纵坐标呢?
解决了行号和列号的问题,那么就可以很方便地求出了某个点的坐标了。总之这里用到的技巧就是:把楼房编号减去1,这样就符合了C++二维数组的顺序,那么就很方便容易地求出了某个点的坐标了。
代码
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int w,n,m;
scanf("%d%d%d",&w,&m,&n);
m--,n--; //让楼房的编号都减去1
int x1=m/w; //求出楼房m的行号
int x2=n/w; //求出楼房n的行号
int y1=m%w; //求出楼房m的列号
int y2=n%w; //求出楼房n的列号
//如果是x1奇数行,说明列号需要翻转
if(x1&1)
y1=w-y1-1;
//如果是x2奇数行,说明列号需要翻转
if(x2&1)
y2=w-y2-1;
printf("%d\n",abs(x1-x2)+abs(y1-y2));
return 0;
}