中國象棋中的跳馬問題(BFS)

2021-09-25 14:19:06 字數 1389 閱讀 8982

題目描述

現在棋盤的大小不一定,由p,q給出,並且在棋盤中將出現障礙物(限制馬的行動,與象棋走法相同)

輸入第一行輸入n表示有n組測試資料。

每組測試資料第一行輸入2個整數p,q,表示棋盤的大小(1<=p,q<=100)。

每組測試資料第二行輸入4個整數,表示馬的起點位置與終點位置。(位置的取值範圍同p,q)

第三行輸入m表示圖中有多少障礙。

接著跟著m行,表示障礙的座標。

輸出馬從起點走到終點所需的最小步數。

如果馬走不到終點,則輸入「can not reach!」

樣例輸入

29 10

1 1 2 3

09 10

1 1 2 3

81 2

2 23 3

3 41 4

3 22 4

1 3樣例輸出

1can not reach!

提示此題是乙個搜尋題,可用dfs或bfs,建議選擇bfs(廣搜)。一開始把馬的起始點加入佇列,然後用廣搜的思想把此點能到達的其他點加入佇列,這裡需要乙個陣列用來記錄此點在之前是否已經加入佇列,如果加入過佇列當中,就不需要再加入了,直到佇列裡的元素為空,或者搜尋到了終點,搜尋即停止,然後輸出相應答案即可。

本題有多種地方需要考慮。首先,重複點和障礙點需要設立2個陣列判別,乙個陣列會導致程式錯誤!(親身經歷!!!);

其次,馬跳的8個方向與4個阻礙馬腿跳的點需要方向一致,否則會出現輸出超限與記憶體超限問題!!!;

最後,bfs的判斷條件一定要考慮清楚,本人考慮的是1:拐點是否有障礙;2:跳的那個點是否在棋盤內,跳的點不能是重複點,跳的點不能是障礙點。

#include#include#include#includeusing namespace std;

struct dir

;dir d[8] = ,,,,,,, }; //馬跳的8個方向

int zhang[4][2] = ; //8個方向對應的4個拐馬角點。

int x,y; //棋盤大小

int a[6];

queueq;

int visit[101][101]; //判斷是否為重複點

int can[101][101]; //判斷是否為障礙點

int cnt;

int check(int a, int b) //檢查點是否在棋盤內

void bfs()

for (int i = 0; i < 8; i++)

}} cout<<"can not reach!"<> n;

while (n--)

bfs();

} return 0;

}

本題的陷阱比較多,需要細心注意!

中國象棋中的跳馬問題 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 第...

中國象棋跳馬問題 bfs寫法

問題大意 給定乙個棋盤以及馬的初始位置和需要到達的終點,棋盤中含有障礙,求馬到終點的最短步數,如果不能到達,則輸出 can not reach 解題思路 bfs直接搜尋即可。標準搜尋模板題,這裡順便講一下bfs。bfs是以初始狀態向能走的所有狀態進行層次遍歷。未知的讀者可以按著我這個思路在紙上畫一下...