百鍊3752:走迷宮--棧實現dfs
阿新 • • 發佈:2021-06-22
3752:走迷宮
- 總時間限制:
- 1000ms
- 記憶體限制:
- 65536kB
- 描述
- 一個迷宮由R行C列格子組成,有的格子裡有障礙物,不能走;有的格子是空地,可以走。
給定一個迷宮,求從左上角走到右下角最少需要走多少步(資料保證一定能走到)。只能在水平方向或垂直方向走,不能斜著走。 - 輸入
- 第一行是兩個整數,R和C,代表迷宮的長和寬。( 1<= R,C <= 40)
接下來是R行,每行C個字元,代表整個迷宮。
空地格子用'.'表示,有障礙物的格子用'#'表示。
迷宮左上角和右下角都是'.'。 - 輸出
- 輸出從左上角走到右下角至少要經過多少步(即至少要經過多少個空地格子)。計算步數要包括起點和終點。
- 樣例輸入
-
5 5 ..### #.... #.#.# #.#.# #.#..
- 樣例輸出
-
9
【分析】 本題用遞迴實現起來不方便,因此用一個結構模擬走迷宮的過程:1 struct node { 2 int x,y; //節點座標 3 int step; //到達該節點需要的步數 4 node(int x,int y,int step) : x(x),y(y),step(step) {}; 5 };
此處,node表示迷宮中的一個“節點”。
用棧實現dfs走迷宮的思想:(1) 將起始節點入棧;
(2) 將起始節點出棧,作為“當前所在的節點”;
(3) 將“當前所在的節點”所能到達的所有節點入棧(這便是下一步所有的路);
(4) 棧頂節點出棧,作為下一步的“當前所在的節點”。
(5) 重複上述過程,直到走到終點。
由於棧後進先出的特點,因此每一個出棧作為“當前所在的節點”的節點一定是上一步剛剛入棧的節點(即上一步的“當前所在的節點”所能直接到達的某個下一
步的節點),因此棧實現的是dfs(而非bfs)。
【程式碼】1 #include <iostream> 2 #include <stack> 3 using namespace std; 4 5 const int maxr = 45; 6 const int maxc = 45;
本題使用bfs實現也可以,只需要把棧換成佇列就行了。