1. 程式人生 > 實用技巧 >藍橋杯2015初賽 - 移動距離 - 找規律

藍橋杯2015初賽 - 移動距離 - 找規律

題目連結

http://oj.ecustacm.cn/problem.php?id=1261

思路

我本來是想用Dijkstra寫的,發現建圖的時候沒有辦法建出來。

看了題解勉強懂了。

  1. 首先判斷給出的兩個數所在行列(也就是其座標);

  2. 之後再判斷他們的奇偶性。如果是奇數說明那一列的資料是倒序(倒著)輸入的,翻轉一下就行;

  3. 需要注意的是,以下程式碼是建立建圖下標從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;
}