現在棋盤的大小不一定,由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
1此題是乙個搜尋題,可用dfs或bfs,建議選擇bfs(廣搜)。一開始把馬的起始點加入佇列,然後用廣搜的思想把此點能到達的其他點加入佇列,這裡需要乙個陣列用來記錄此點在之前是否已經加入佇列,如果加入過佇列當中,就不需要再加入了,直到佇列裡的元素為空,或者搜尋到了終點,搜尋即停止,然後輸出相應答案即可。can not reach!
這道題並不難,就是hdu1372變一下,加了乙個蹩腳的條件。前兩天寫的時候wa了十幾回,想不通,感覺做法和標程差不多。今天拿來重新做,才發現了當時沒有發現的乙個重大問題。我在判斷是否蹩腳的時候是從終點(v.x,v.y)判斷的,但是應該是判斷起跳點(u.x,u.y)能否到終點!!!乙個小問題弄了半天!感覺下次出現這種問題需要冷靜一下,不能一直悶頭找,隔一段時間重新看會好一點。雖然用的stl的佇列會慢很多,但幸好沒有超時,就先這樣吧,等複習a*的時候看能不能加速。
1 #include2 #include3 #include4 #include5 #include6view code 1using
namespace
std;
7struct
pos8
;11 pos dir[8]=,,,,,,,};
12struct
node13;
16 queueque;
17int map[105][105
];18
int vis[105][105
];19
intp,q,sx,sy,ex,ey,ans;
2021
bool
in(int a,int
b)22
2627
bool can_move(int x,int y,int
d)28
33if(d==2||d==3)37
if(d==4||d==5)41
if(d==6||d==7)45
}4647int
bfs()
4872}73
}74}75
return -1;76
}7778int
main()
7999 ans=-1
;100 ans=bfs();
101if(ans>-1) printf("
%d\n
",ans);
102else printf("
can not reach!\n");
103}
104return0;
105 }
正好大概了解了一下怎樣造資料:
#include#includeview code 2#include
intmain()
}return0;
}
中國象棋中的跳馬問題 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 第...