模拟-第六届蓝桥杯省赛C++B组-移动距离
题目:
X星球居民小区的楼房全是一样的,并且按矩阵样式排列。
其楼房的编号为 1,2,3…
当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为 6 时,开始情形如下:
1
2
3
4
5
6
\ 1\ \ \ 2 \ \ \ 3 \ \ 4 \ 5\ 6
1 2 3 4 5 6
12
11
10
9
8
7
12 \ 11 \ 10\ 9\ 8\ 7
12 11 10 9 8 7
13
14
15.....
13 \ 14\ 15 .....
13 14 15.....
我们的问题是:已知了两个楼号 m 和 n,需要求出它们之间的最短移动距离(不能斜线方向移动)。
输入格式
输入共一行,包含三个整数 w,m,n,w 为排号宽度,m,n 为待计算的楼号。
输出格式
输出一个整数,表示 m,n 两楼间最短移动距离。
数据范围
1≤w,m,n≤10000,
输入样例:
6 8 2
输出样例:
4
题解:
将 所 有 数 减 1 , 数 据 从 0 开 始 递 增 , 则 二 维 数 组 中 的 任 意 元 素 a [ i ] [ j ] 所 在 的 行 号 x = ⌊ a [ i ] [ j ] w ⌋ , 将所有数减1,数据从0开始递增,则二维数组中的任意元素a[i][j]所在的行号x=\lfloor\frac{a[i][j]}{w}\rfloor, 将所有数减1,数据从0开始递增,则二维数组中的任意元素a[i][j]所在的行号x=⌊wa[i][j]⌋,
若 序 列 是 按 照 正 常 二 维 数 组 排 列 顺 序 进 行 排 列 的 , 列 号 y = a [ i ] [ j ] % w , 若 逆 序 排 列 , 列 号 y ′ = w − 1 − y 。 若序列是按照正常二维数组排列顺序进行排列的,列号y=a[i][j]\%w,若逆序排列,列号y'=w-1-y。 若序列是按照正常二维数组排列顺序进行排列的,列号y=a[i][j]%w,若逆序排列,列号y′=w−1−y。
因 此 对 奇 数 行 的 列 号 特 判 即 可 。 因此对奇数行的列号特判即可。 因此对奇数行的列号特判即可。
补 充 : 补充: 补充:
对 平 面 坐 标 系 中 任 意 两 点 ( x 1 , y 1 ) , ( x 2 , y 2 ) 对平面坐标系中任意两点(x_1,y_1),(x_2,y_2) 对平面坐标系中任意两点(x1,y1),(x2,y2)
① 、 曼 哈 顿 距 离 = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ 。 ①、曼哈顿距离=|x_1-x_2|+|y_1-y_2|。 ①、曼哈顿距离=∣x1−x2∣+∣y1−y2∣。
② 、 欧 几 里 得 距 离 = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 ②、欧几里得距离=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2} ②、欧几里得距离=(x1−x2)2+(y1−y2)2
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<sstream>
#define ll long long
#define inf 0x7fffffff
using namespace std;
int main()
{
int w,m,n;
cin>>w>>m>>n;
m--,n--;
int x1=m/w,x2=n/w;
int y1=m%w,y2=n%w;
if(x1%2) y1=w-1-y1;
if(x2%2) y2=w-1-y2;
cout<<abs(x2-x1)+abs(y2-y1)<<endl;
return 0;
}