第十屆藍橋杯A組C C 試題D迷宮

2021-10-09 20:21:00 字數 1413 閱讀 5735

題目

下圖給出了乙個迷宮的平面圖,其中標記為 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...