題目
下圖給出了乙個迷宮的平面圖,其中標記為 1 的為障礙,標記為 0 的為可 以通行的地方。
010000
000100
001001
110000
迷宮的入口為左上角,出口為右下角,在迷宮中,只能從乙個位置走到這 個它的上、下、左、右四個方向之一。 對於上面的迷宮,從入口開始,可以按drrurrdddr 的順序通過迷宮, 一共 10 步。其中 d、u、l、r 分別表示向下、向上、向左、向右走。 對於下面這個更複雜的迷宮(30 行 50 列),請找出一種通過迷宮的方式, 其使用的步數最少,在步數最少的前提下,請找出字典序最小的乙個作為答案。 請注意在字典序中d首先要求最短路就一定是bfs而不是dfs,關鍵點在於要求最短路徑前提下字典序最小的路,要滿足最短路字典序最小,按照d,l,r,u順序方向走到終點即為字典序最小的最短路徑。
若已得到最短路,那麼該怎麼記錄每一步走的方向呢?
可以先倒著bfs,即以終點作為開始,逆著找起點,並記錄下地圖上每一點(x,y)到終點(30-1,50-1)的路徑長度dis[x][y]=***。
為什麼要倒著搜尋並記錄每一點到終點路徑長度?
問得好,為了知道(x,y)是經過哪個方向到達的(xnext,ynext),我們若已知每一點(x,y)到終點(30-1,50-1)的路徑長度。即可正著以(0,0)為起點再來一次類似bfs的搜尋(不需要再push佇列,說白了就是普通搜尋),通過dis[x][y]==dis[xnext][ynext]+1來判斷(xnext,ynext)是不是我們要走的最短路。因為只有是最短路其路上先後兩點的距離差為1。
另外此題佇列push的時候未使用結構體,而是用了跟絲雨大佬學的用push(x*行+y),這樣再取出數的時候int x= temp/50,y= temp%50 即可。
**如下
#include
#include
#include
#include
using
namespace std;
int mp[
50]=;
int vis[35]
[55];
int dis[35]
[55];
int dir[4]
[2]=
,//下
,// 左
,// 右
// 上};
queue<
int> q;
void
bfs()}
}}intmain()
;while
(x!=
29&& y!=49)
}}} cout << road
}
第十屆藍橋杯 JavaA 迷宮
法一 思路 bfs,path記錄路徑。1.程式設計 2.觀察 description todo author frontier time 2019年4月9日 上午11 19 05 class node public class d迷宮 增量陣列,方向向量,直接按字典序排列 static int y ...
2019第十屆藍橋杯C C
這是我第一次參加藍橋杯比賽,比完後,有點低於預期,自己的發揮低於預期,賽事水準也低於預期。教室裡面很多同學的電腦出現問題,舉辦學校也沒有完善的應急方案,有一部分同學11點鐘才可以做題。提取碼 560f1.給20個球員擔任五個不同位置的得分,要你選五個球員組成一支球隊的最大得分。這道題要是全排列做的話...
第十屆藍橋杯c組
求和 1905111 這裡的string npos可以使用 1代替 include include using namespace std intmain cout 矩形切割 21 include include using namespace std intmain cout 年號字元 byq i...