藍橋杯2015初賽 - 移動距離 - 找規律
阿新 • • 發佈:2020-10-12
題目連結
http://oj.ecustacm.cn/problem.php?id=1261
思路
我本來是想用Dijkstra寫的,發現建圖的時候沒有辦法建出來。
看了題解勉強懂了。
-
首先判斷給出的兩個數所在行列(也就是其座標);
-
之後再判斷他們的奇偶性。如果是奇數說明那一列的資料是倒序(倒著)輸入的,翻轉一下就行;
-
需要注意的是,以下程式碼是建立建圖下標從0開始的,而不是1。
AC程式碼
#include<iostream> #include<stdio.h> #include<cmath> #include<algorithm> #include<queue> #include<map> #include<stack> #include<vector> using namespace std; #define inf 0x3f3f3f3f int main() { int w, w1, w2; while (cin >> w >> w1 >> w2) { //cout << (3 & 1) << endl; // 奇數1 //cout << (2 & 1) << endl; // 偶數0 int x1 = (w1 - 1) / w, x2 = (w2 - 1) / w; // 計算w1和w2所在的行 // -1 是因為下標都從0開始 int y1 = (w1 - 1) % w, y2 = (w2 - 1) % w; // 計算w1和w2所在的列 if (x1 & 1) y1 = w - 1 - y1; // 判斷是否是奇數 if (x2 & 1) y2 = w - 1 - y2; // 判斷是否是奇數 //w-1是因為下標從0開始,判斷是奇數的話說明那一列的數是倒序,需要反轉 int ans = abs(x1 - x2) + abs(y1 - y2); // 輸出曼哈頓距離 printf("%d\n", ans); } return 0; }