題目
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
思路
這道題是求曼哈頓距離:|x1-x2|+|y1-y2|
還運用了c++中二維陣列下標從零開始
首先先畫出正常的圖

然后根據c++二維陣列下標從零開始畫出如下的圖

我們可以發現規律:
行號h=m/w
列號l=n%w
之后由題意得排列的方式是蛇形 得出下圖

這里的行號不變,只需判斷列號即可
由圖發現只有奇數行的列號發生改變
因此我們需要判斷是否為奇數行
代碼
#include<bits/stdc++.h>
using namespace std;
int main()
{
int w, m, n;
cin >> w >> m >> n;
m --, n -- ;//二維陣列從零開始
int x1, x2, y1, y2;
x1 = m / w;
x2 = n / w;
y1 = m % w;
y2 = n % w;
//判斷是否為奇數行
if (x1 % 2 != 0) y1 = w - 1 - y1;
if (x2 % 2 != 0) y2 = w - 1 - y2;
cout << abs(x1 - x2) + abs(y1 - y2) << endl;//曼哈頓距離
return 0;
}
題目鏈接
https://www.acwing.com/problem/content/1221/
各位小伙伴們快來試試吧!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/275548.html
標籤:其他
上一篇:unity學習之小球吃方塊小游戲(從制作到發布程式,超詳細全教程)
下一篇:python簡單游戲-反彈球
