蓝桥杯 8. 移动距离
移动距离
原题目链接
题目描述
X 星球居民小区的楼房全是一样的,并且按矩阵样式排列。楼房的编号为 1, 2, 3, ⋯⋯
。
当排满一行时,从下一行相邻的楼往反方向排号。
例如,当小区排号宽度为 6
时,排列如下:
1 2 3 4 5 6
12 11 10 9 8 7
13 14 15 ...
问题
已知两个楼号 m
和 n
,需要求出它们之间的最短移动距离(只允许水平和垂直方向移动,不能斜着走)。
输入描述
输入一行,包含 3 个整数:
w
:排号宽度;m
:楼号 m;n
:楼号 n。
数据范围:
1 ≤ w, m, n ≤ 10000
。
输出描述
输出一个整数,表示 m
和 n
两楼之间的最短移动步数。
输入输出样例
示例 1
输入
6 2 8
输出
4
示例 2
输入
4 7 20
输出
5
c++代码
#include<bits/stdc++.h>using namespace std;int main() {int w, m, n, i, j, k, l;cin >> w >> m >> n;i = m / (w + 1), k = n / (w + 1);if (i % 2 == 0) j = m - i * w - 1;else j = (w - 1) - (m - (i * w) - 1);if (k % 2 == 0) l = n - k * w - 1;else l = (w - 1) - (n - (k * w) - 1);cout << abs(i - k) + abs(j - l);return 0;
}//by wqs
题目解析
一个结论
对于宽度为w的数字m
他在第m / (w + 1)行
如果行为偶数,它在第m - i * w - 1列
如果行为奇数,它在第(w - 1) - (m - (i * w) - 1)列
注意从下标0开始。
最后答案就是abs(i - k) + abs(j - l)