題目描述
現在棋盤的大小不一定,由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 第...