移動距離
原題目鏈接
題目描述
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)