題意:
左上角是迷宮入口,右下角是迷宮出口,尋找從入口到出口的最短路徑並輸出最短路徑。
輸入:
輸入是乙個5 × 5的二維陣列,僅由0、1兩數字組成,表示法陣地圖。
輸出:
輸出若干行,表示從左上角到右下角的最短路徑依次經過的座標,格式如樣例所示。資料保證有唯一解。
輸入樣例:
0 1 0 0 0
0 1 0 1 0
0 1 0 1 0
0 0 0 1 0
0 1 0 1 0
輸出樣例:
(0, 0)
(1, 0)
(2, 0)
(3, 0)
(3, 1)
(3, 2)
(2, 2)
(1, 2)
(0, 2)
(0, 3)
(0, 4)
(1, 4)
(2, 4)
(3, 4)
(4, 4)
思路分析:
本題目是典型的迷宮類問題,要求找到最短路徑並輸出。採用bfs演算法從起點進行遍歷直到找到到終點的最短路徑。類似於樹的層次遍歷。需要乙個bool型別陣列記錄每乙個點是否已訪問過。可以用int型別二維陣列或者給點型別結構體增加乙個int型別元素的方式來記錄到各點的最短路徑的距離。從初始點開始訪問,將其標記為已訪問過併入佇列,然後依次從佇列中取出每乙個點訪問每乙個未被訪問過但可到達的鄰接點,並均標記為已訪問過,將這些點加入到佇列中去,以此類推直到到達終點或者所有從起點可達的頂點均被訪問過。
注意事項:
1、本題目要求以座標的形式輸出路徑,可使用遞迴輸出,但為防止遞迴棧溢位,一般採用vector或stack來儲存路徑然後輸出。
2、增加常量陣列d[x][y]=,,,};或者d[x]=;d[y]=;可以更方便訪問乙個頂點的四個方向的鄰接點。
3、bool型別的vis陣列其實可以省略掉,記錄最短距離長度的int型別dis陣列在最開始時可用memset函式賦初值為-1,之後只要某乙個點的dis值小於0,則代表未被訪問過,對其dis值更新為最短距離長度,此時大於0,則表示已經訪問過該點。
總結:
簡單的bfs搜尋最短路徑問題,在資料結構課程中已經學習的比較多了,不過這裡用stl練習加深了熟練程度,以後可能遇到的題目一般不會是這麼簡單的迷宮問題,要麼是很複雜的改進過的迷宮問題(如2000 acm/icpc world finals abbott』s revenge),或者是類似於迷宮問題但更抽象化的問題,比如倒水問題,但都是基於bfs搜尋最短路徑的演算法的,這是基礎演算法,理應熟練掌握。
參考**:
#include
using
namespace std;
struct point};
const
int dx=
;const
int dy=
;int maze[5]
[5];
bool vis[5]
[5];
int dis[5]
[5];
const
int tx=4;
const
int ty=4;
intmain
(int argc,
const
char
* ar**)
for(
int i=
0; i<
4; i++)}
} vector vec;
//輸出最短路徑也可以用stack來實現
vec.
push_back
(point
(tx,ty));
dis_min--
;while
(dis_min>0)
} dis_min--;}
cout<<
"("<<
0<<
", "
<<
0<<
")"
(!vec.
empty()
)return0;
}
week2作業題 bfs迷宮問題 bfs倒水問題
東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到妹紙就不難了,請你編乙個程式,寫出東東找到妹紙的最短路線。input 輸入是乙個5 5的二維陣列,僅由0 1兩數字組成,表示法陣地圖。outpu...
程式設計Week2作業題B 倒水問題
題意 給你兩個容器,容量分別為a,b 問是否能夠經過有限的步驟倒水,得到容量為 c 的水。輸入 輸入包含多組資料。每組資料輸入 a,b,c 資料範圍 0 a b c b 1000 a和b互質。輸出 你的程式的輸出將由一系列的指令組成。這些輸出行將導致某乙個罐子 不指定是哪乙個罐子 正好包含c單位的水...
程式設計思維與實踐 week2 作業題 倒水問題
倒水問題 fill a 表示倒滿a杯,empty a 表示倒空a杯,pour a b 表示把a的水倒到b杯並且把b杯倒滿或a倒空。輸入包含多組資料。每組資料輸入 a,b,c 資料範圍 0 a b c b 1000 a和b互質。你的程式的輸出將由一系列的指令組成。這些輸出行將導致任何乙個罐子正好包含c...