問題大意:給定乙個棋盤以及馬的初始位置和需要到達的終點,棋盤中含有障礙,求馬到終點的最短步數,如果不能到達,則輸出「can not reach!」。
解題思路:
bfs直接搜尋即可。
標準搜尋模板題,這裡順便講一下bfs。bfs是以初始狀態向能走的所有狀態進行層次遍歷。
未知的讀者可以按著我這個思路在紙上畫一下:(以下為bfs標準寫法思路)
假設初始狀態為a且a能走a1,a2,a3三種狀態,而a1,a2,a3又能分別向下擴充套件3個狀態,也就是乙個樹結構。
先將a放入佇列(用佇列的原因是因為是先進先出,符合層次遍歷的需求),然後判斷佇列不為空,取出a,讓a向下擴充套件3個狀態,依次存入佇列,再判斷佇列不為空,取出隊首元素,也就是a1,讓a1向下擴充套件,依次存入佇列,再判斷佇列不為空,取出隊首元素,也就是b1,按以上方式迴圈取,直至取到符合最終狀態的狀態或者隊列為空為止。
ac**:
#include
using
namespace std;
struct qizi
;int ex,ey;
//終點位置
int p,q;
//棋盤大小
int ans;
int dir[8]
[2]=
,,,,
,,,}
;//馬能走的8個方向
int ddd[8]
[2]=
,,,,
,,,}
;//對應阻礙馬8個方向的障礙的位置
int vis[
105]
[105];
//判斷是否重複走過該點
queueque;
//這個建議設區域性變數放bfs函式中,不然就和我一樣,每次都要把佇列清空
bool
check
(qizi w)
intbfs
(qizi w)
}return-1
;}intmain()
ans=
bfs(sss);if
(ans!=-1
)printf
("%d\n"
,ans)
;else
printf
("can not reach!\n");
}return0;
}
中國象棋的跳馬問題(BFS)
題目描述 現在棋盤的大小不一定,由p,q給出,並且在棋盤中將出現障礙物 限制馬的行動,與象棋走法相同 輸入 第一行輸入n表示有n組測試資料。每組測試資料第一行輸入2個整數p,q,表示棋盤的大小 1 p,q 100 每組測試資料第二行輸入4個整數,表示馬的起點位置與終點位置。位置的取值範圍同p,q 第...
中國象棋中的跳馬問題 bfs
現在棋盤的大小不一定,由p,q給出,並且在棋盤中將出現障礙物 限制馬的行動,與象棋走法相同 第一行輸入n表示有n組測試資料。每組測試資料第一行輸入2個整數p,q,表示棋盤的大小 1 p,q 100 每組測試資料第二行輸入4個整數,表示馬的起點位置與終點位置。位置的取值範圍同p,q 第三行輸入m表示圖...
中國象棋中的跳馬問題(BFS)
題目描述 現在棋盤的大小不一定,由p,q給出,並且在棋盤中將出現障礙物 限制馬的行動,與象棋走法相同 輸入第一行輸入n表示有n組測試資料。每組測試資料第一行輸入2個整數p,q,表示棋盤的大小 1 p,q 100 每組測試資料第二行輸入4個整數,表示馬的起點位置與終點位置。位置的取值範圍同p,q 第三...