藍橋杯 演算法提高 學霸的迷宮(bfs)(C )

2021-10-08 18:22:12 字數 2309 閱讀 5954

資源限制

時間限制:1.0s 記憶體限制:256.0mb

問題描述

學霸搶走了大家的作業,班長為了幫同學們找回作業,決定去找學霸決鬥。但學霸為了不要別人打擾,住在乙個城堡裡,城堡外面是乙個二維的格仔迷宮,要進城堡必須得先通過迷宮。因為班長還有妹子要陪,磨刀不誤砍柴功,他為了節約時間,從線人那裡搞到了迷宮的地圖,準備提前計算最短的路線。可是他現在正向妹子解釋這件事情,於是就委託你幫他找一條最短的路線。

輸入格式

第一行兩個整數n, m,為迷宮的長寬。

接下來n行,每行m個數,數之間沒有間隔,為0或1中的乙個。0表示這個格仔可以通過,1表示不可以。假設你現在已經在迷宮座標(1,1)的地方,即左上角,迷宮的出口在(n,m)。每次移動時只能向上下左右4個方向移動到另外乙個可以通過的格仔裡,每次移動算一步。資料保證(1,1),(n,m)可以通過。

輸出格式

第一行乙個數為需要的最少步數k。

第二行k個字元,每個字元∈,分別表示上下左右。如果有多條長度相同的最短路徑,選擇在此表示方法下字典序最小的一個。

樣例輸入

input sample 1:

3 3001

100110

input sample 2:

3 3000

000000

樣例輸出

output sample 1:

4rdrd

output sample 2:

4ddrr

資料規模和約定

有20%的資料滿足:1<=n,m<=10

有50%的資料滿足:1<=n,m<=50

有100%的資料滿足:1<=n,m<=500。

1.首先介紹一下廣度優先搜尋(bfs)演算法。(如下圖所示) 大體步驟:

a .首先選擇乙個頂點作為起始結點,並將其染成灰色,其餘結點為白色;

b. 將起始結點放入佇列中;

c.從佇列首部選出乙個頂點,並找出所有與之鄰接的結點,將找到的鄰接結點放入佇列尾部,將已訪問過結點出隊並塗成黑色。如果頂點的顏色是灰色,表示已經發現並且放入了佇列,如果頂點的顏色是白色,表示還沒有發現;

d. 按照同樣的方法處理佇列中的下乙個結點。

2.這道題就是一道簡單的廣度優先搜尋的題目。題目中需求出從迷宮左上角到右下角的最短路徑所用的步數以及路徑,因此用乙個結構體將當前點的位置、步數、路徑儲存起來。題目中說,當路徑相同的時候按照字典序輸出最小的,那麼我們就可以按照u,d,l

,r 這四個字母的字典序的順序由小到大進行搜尋(即d,l,r,u)

,那麼出來的結果就是題目要求的優先輸出字典序小的路徑。

#include

#include

#include

#include

#include

using

namespace std;

int n,m;

char map[

510]

[510];

//儲存地圖;

int flag[

510]

[510];

//標記是否搜尋過;

int nextt[4]

[2]=

,,,}

;//這個要注意,題目要求路徑一樣的按照字典序小的輸出;

//按照字典序小的順序依次搜尋下,左,右,上;

char k[4]

=;struct node

;void

bfs(

)for

(i=0

; i<

4; i++

)//四個方向進行搜尋;

}return;}

intmain()

bfs();

}return0;

}

演算法提高 學霸的迷宮 藍橋杯

問題描述 學霸搶走了大家的作業,班長為了幫同學們找回作業,決定去找學霸決鬥。但學霸為了不要別人打擾,住在乙個城堡裡,城堡外面是乙個二維的格仔迷宮,要進城堡必須得先通過迷宮。因為班長還有妹子要陪,磨刀不誤砍柴功,他為了節約時間,從線人那裡搞到了迷宮的地圖,準備提前計算最短的路線。可是他現在正向妹子解釋...

演算法提高 學霸的迷宮(藍橋杯)

問題描述 學霸搶走了大家的作業,班長為了幫同學們找回作業,決定去找學霸決鬥。但學霸為了不要別人打擾,住在乙個城堡裡,城堡外面是乙個二維的格仔迷宮,要進城堡必須得先通過迷宮。因為班長還有妹子要陪,磨刀不誤砍柴功,他為了節約時間,從線人那裡搞到了迷宮的地圖,準備提前計算最短的路線。可是他現在正向妹子解釋...

藍橋杯 演算法提高 學霸的迷宮

問題描述 學霸搶走了大家的作業,班長為了幫同學們找回作業,決定去找學霸決鬥。但學霸為了不要別人打擾,住在乙個城堡裡,城堡外面是乙個二維的格仔迷宮,要進城堡必須得先通過迷宮。因為班長還有妹子要陪,磨刀不誤砍柴功,他為了節約時間,從線人那裡搞到了迷宮的地圖,準備提前計算最短的路線。可是他現在正向妹子解釋...