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

2021-08-03 20:53:52 字數 1608 閱讀 7364

題目描述

現在棋盤的大小不一定,由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個作用,

1)路障所佔的地方不可以作為出發點和到達點,1個位置。

2)路障可以ban馬的行走路線,8個位置

(大家可以自己畫個圖,理解下。)

馬可以跳8個方向,可以定義乙個方向陣列

position dir[8]=,,,,,,,};

相應的乙個障礙也ban 8個方向的馬的行走路線

bar  cir[8]=,,,,,,,};

這裡一定要準確,當初自己沒有數對wa了3發。

#include #include #include #include using namespace std;

//定義方向陣列dir 為8個方向的偏移量

struct position

;struct bar

;struct node

;int barrier [105][105];

position dir[8]=,,,,,,,};

bar cir[8]=,,,,,,,};

int vis[102][102];

int p,q,srow,scol,erow,ecol,m,a,b,ans,flag; //其實結束位置

queueque;

int in(int a,int b)

int bfs()

for(int i=0;i<8;i++) //向8個方向擴充套件}}

}} int main()

bfs();

if(flag==1)

printf("%d",ans);

else

printf("can not reach!");

printf("\n");

}}

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

題目描述 現在棋盤的大小不一定,由p,q給出,並且在棋盤中將出現障礙物 限制馬的行動,與象棋走法相同 輸入 第一行輸入n表示有n組測試資料。每組測試資料第一行輸入2個整數p,q,表示棋盤的大小 1 p,q 100 每組測試資料第二行輸入4個整數,表示馬的起點位置與終點位置。位置的取值範圍同p,q 第...