[题目概述]
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
- 分析题目
本题就是要求两个点之间的一个最短距离,那么我们现在就是要求出每一栋楼的坐标,这个楼的顺序是按照蛇形数组来排列。可以将每一个数字都减一,即m - - , n - - , 这样就是从0开始了。-
行号
m / w, n / w即为行号。 -
列号
通过观察可以发现,蛇形矩阵中只有奇数行的数顺序会发生反转。那么我们可以先按顺序的矩阵来推
我们可以发现现在数的列号就是对w取余的结果,而奇数列需要将列号反转,就变成了5 - m % w,所以现在列号就写出来了
奇数列:w - 1 - m % w
偶数列:m % w
-
- 完整代码(注释版)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int w, m, n;
int main () {
cin >> w >> m >> n;
m --, n --;
// 记录横向和纵向长度
int wide = 0, high = 0;
// 两个数的行号
int h1 = m / w, h2 = n / w;
high = abs(h1 - h2);
// 两个数的列号
int w1 = 0, w2 = 0;
w1 = m % w, w2 = n % w;
if (h1 % 2 == 1)
w1 = w - 1 - w1;
if (h2 % 2 == 1)
w2 = w - 1 - w2;
wide = abs(w1 - w2);
cout << high + wide << endl;
return 0;
}
- 本题的分享就结束了,有问题的小伙伴可以发在评论区
记得点赞关注加收藏!