中國象棋跳馬問題 bfs寫法

2021-09-25 15:09:01 字數 1243 閱讀 8711

問題大意:給定乙個棋盤以及馬的初始位置和需要到達的終點,棋盤中含有障礙,求馬到終點的最短步數,如果不能到達,則輸出「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 第三...