時間限制:10000ms
單點時限:1000ms
記憶體限制:256mb
描述小hi:小ho你會下西洋棋麼?
小ho:應該算會吧,我知道每個棋子的移動方式,馬走日象飛田什麼的…
小hi:象飛田那是中國象棋啦!
小ho:哦,對。西洋棋好像是走斜線來著。
小hi:不過馬走日倒是對了。西洋棋中的馬一般叫做騎士,關於它有個很有意思的問題。
小ho:什麼啊?
小hi:騎士巡遊問題,簡單來說就是關於在棋盤上放置若干個騎士,然後**移動這些騎士是否能滿足一定的而要求。舉個例子啊:乙個騎士從起始點開始,能否經過棋盤上所有的格仔再回到起點。
小ho:哦,看上去好像很難的樣子。
小hi:其實也還好了。簡單一點的比如棋盤上有3個騎士,能否通過若干次移動走到一起。
小ho:能夠麼?
小hi:當然能夠了。由於騎士特殊的移動方式,放置在任何乙個初始位置的騎士,都可以通過若干次移動到達棋盤上任意乙個位置。
小ho:那麼只要選定乙個位置,把它們全部移動過去就好了是吧?
小hi:是的,那麼這裡又有另乙個問題了:要選擇哪乙個位置匯合,使得3個騎士行動的總次數最少?
小ho:嗯,這個好像不是很難,讓我想一想。
輸入第1行:1個正整數t,表示資料組數,2≤t≤10。
第2..t+1行:用空格隔開的3個座標, 每個座標由2個字元ab組成,a為』a』~』h』的大寫字母,b為』1』~』8』的數字,表示3個棋子的初始位置。
輸出第1..t行:每行1個數字,第i行表示第i組資料中3個棋子移動到同一格的最小行動步數。
樣例輸入
2 a1 a1 a1
b2 d3 f4
樣例輸出 0 2
#include "iostream"
#include "stdio.h"
#include "queue"
#include "utility"
#include "string.h"
using
namespace
std;
int t;
int initx[10];
int inity[10];
int step[4][9][9];
queue
< pair > q;
const
int dx = ;
const
int dy = ;
void bfs(int k, int x, int y)}}
}int solve()
return min;
}int main()
cout
<< solve() << endl;
}return
0;}
BFS(廣搜) 騎士旅行
ssl 1456 題目描述 在乙個n m 格仔的棋盤上,有乙隻西洋棋的騎士在棋盤的左下角 1 1 騎士只能根據象棋的規則進行移動,要麼橫向跳動一格縱向跳動兩格,要麼縱向跳動一格橫向跳動兩格。例如,n 4,m 3 時,若騎士在格仔 2 1 則騎士只能移入下面格仔 1 3 3 3 或 4 2 對於給定正...
SCOI2005 騎士精神 雙向廣搜
目錄 一.雙向bfs 1.引入 2.概念 3.偽板子及解釋 4.運用hash進行標記 二.引入一道不太難的題目 1.題目 2.解題思路 3.如果還不懂,可供參考 謝謝!廣搜這種東西相信大家都很熟悉吧,相信曾經想剪枝也是快想禿頭了吧。雙向bfs正是一種很好的優化方法。它可以將時間複雜度折半。一般的bf...
迷宮問題 廣搜
定義乙個二維陣列 int maze 5 5 queue 26 int head 0,tail 0,a 5 5 book 5 5 void function int tail 引數是隊尾 else function queue tail f 如果隊尾的父節點不是0 就將該父節點作為新的隊尾繼續呼叫 這...