迷宮問題 BFS(廣度優先搜尋)

2021-09-10 07:07:27 字數 1202 閱讀 3310

之前寫迷宮問題用的都是遞迴求解,採用的是dfs深度優先搜尋,從來沒有想到過用廣度優先搜尋,這次碰到了乙個迷宮題,之前的dfs不太合適。

題目鏈結點此

假設乙個探險家被困在了地底的迷宮之中,要從當前位置開始找到一條通往迷宮出口的路徑。迷宮可以用乙個二維矩陣組成,有的部分是牆,有的部分是路。迷宮之中有的路上還有門,每扇門都在迷宮的某個地方有與之匹配的鑰匙,只有先拿到鑰匙才能開啟門。請設計乙個演算法,幫助探險家找到脫困的最短路徑。如前所述,迷宮是通過乙個二維矩陣表示的,每個元素的值的含義如下 0-牆,1-路,2-探險家的起始位置,3-迷宮的出口,大寫字母-門,小寫字母-對應大寫字母所代表的門的鑰匙。

簡單來說就是牆為0,路為1,3為出口,其中路上有門或者鑰匙,大寫為門小寫為鑰匙,求最短路徑。由於之前認為迷宮只要掌握dfs即可以了,現在看來是我菜了。

如果你看不懂我說的話,可以看一下維基百科咋寫的——bfs廣度優先搜尋

由於bfs是所有通路均走,只要下一步存在,每條通路都走一步,因此需要乙個合適的資料結構,這個結構就是佇列。

佇列裡面儲存當前位置資訊,隊首的節點每有乙個通路,就把下乙個節點壓入佇列,彈出隊首節點,實現每條路徑都走一步,優先廣度搜尋。

那麼剛才那個題問題就會變得很簡單,變成了bfs求最優解,只不過在bfs基礎上加了乙個鑰匙的過程,給出下面**,**參考牛客網元氣の悟空

#include

#include

#include

#include

#include

using namespace std;

int next_step[4]

[2]=

;char check[

105]

[105][

1200];

int m =

0, n =0;

struct node

int x;

int y;

int key;

int step;};

intcrackmaze

(vector

& maze, node& start)}}

return0;

}int

main()

}}cout <<

crackmaze

(maze, n)

;return0;

}

迷宮問題(廣度優先搜尋BFS

給定乙個迷宮,入口為左上角,出口為右下角,問是否有路徑從入口到出口,若有則輸出一條這樣的路徑。注意移動可以從上 下 左 右 上左 上右 下左 下右八個方向進行。迷宮輸入0表示可走,輸入1表示牆。易得可以用1將迷宮圍起來避免邊界問題。本題採用bfs演算法給出解。注意,利用bfs演算法給出的路徑必然是一...

迷宮 BFS 廣度優先搜尋

小c最近在研究機械人,他想看看自己的機械人夠不夠智慧型,於是他將機械人放在乙個n m的迷宮中,看看機械人能不能在最短的時間內到達目的地,可是小c不知道最短的時間是多少,現在請你幫他算算機械人到達目的地的最短時間是多少?輸入描述 輸入資料第一行兩個整數n和m。n和m的範圍 10,500 接下來n行,每...

迷宮問題 (bfs廣度優先搜尋記錄路徑)

定義乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。input 乙個5 5的二維陣列,表示乙個迷宮。資料保證有唯一解。output 左上角到右下角的最短路徑,格式如樣例所示。sa...