移动距离(蓝桥杯模拟题)

1219. 移动距离

 

X星球居民小区的楼房全是一样的,并且按矩阵样式排列。

其楼房的编号为 1,2,31,2,3…

当排满一行时,从下一行相邻的楼往反方向排号。

比如:当小区排号宽度为 66 时,开始情形如下:

1  2  3  4  5  6
12 11 10 9  8  7
13 14 15 .....

我们的问题是:已知了两个楼号 mm 和 nn,需要求出它们之间的最短移动距离(不能斜线方向移动)。

输入格式

输入共一行,包含三个整数 w,m,nw,m,n,ww 为排号宽度,m,nm,n 为待计算的楼号。

输出格式

输出一个整数,表示 m,nm,n 两楼间最短移动距离。

数据范围

1w,m,n100001≤w,m,n≤10000,

代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int w,m,n;
    cin>>w>>m>>n;
    m--,n--;//序号减一,便于利用公式求行号和列号
    int x1=m/w,y1=m%w;//横纵坐标分别表示行号和列号
    int x2=n/w,y2=n%w;
    if(x1%2) y1=w-1-y1;//特判,因为是蛇形编号,所以奇数行需要改变坐标
    if(x2%2) y2=w-1-y2;
    cout<<abs(x1-x2)+abs(y1-y2);//求曼哈顿距离
    return 0;
}

 

posted @ 2022-02-21 14:41  zzq12138  阅读(68)  评论(0)    收藏  举报