迷宮問題
description
定義乙個二維陣列:
int maze[5][5] = ;
它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到
右下角的最短路線。
input
乙個5 × 5的二維陣列,表示乙個迷宮。資料保證有唯一解。
output
左上角到右下角的最短路徑,格式如樣例所示。
sample input
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
sample output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
解決方案:
對於這題,我們可以把它maze陣列轉化為乙個圖,不能通過的話,即兩點之間無路徑,然後利用dijkstra演算法尋找s點到t點的最短路徑。
dijkstra演算法可參考維基百科迪科斯徹演算法,其核心**如下:
1對於上圖,我們的演算法可以大大簡化,因為每條路徑的權重都相等,由於dijkstra是按照廣度優先搜尋來進行遍歷的,因而在我們這,先到達這個點的路徑即為最短路徑(這裡對照上圖,在紙上畫一畫就可以體會到)。function dijkstra(g, w, s)
2for each vertex v in v[g] //
初始化3 d[v] := infinity //
將各點的已知最短距離先設定成無窮大
4 previous[v] := undefined //
各點的已知最短路徑上的前趨都未知
5 d[s] := 0
//因為出發點到出發點間不需移動任何距離,所以可以直接將s到s的最小距離設為0
6 s := empty set
7 q := set
of all vertices
8while q is not an empty set
//dijkstra演演算法主體
9 u :=extract_min(q)
1011
for each edge outgoing from u as
(u,v)
12if d[v] > d[u] + w(u,v) //
拓展邊(u,v)。w(u,v)為從u到v的路徑長度。
13 d[v] := d[u] + w(u,v) //
更新路徑長度到更小的那個和值。
14 previous[v] := u //
記錄前趨頂點
對於第9行的 u := extract_min(q) ,我們就用乙個佇列來表示q,因為先進來的點的距離不會大於後進來的點,每次從佇列頭部取出元素,效果與extract_min(q)一樣。
**如下:
1 #include 2 #include 34#define n 556
void print(int value, int prev[n*n])715
}1617void solve(int
maze[n][n])
18,//
向上24 ,//
向下25 ,//
向左26 //
向右27
};28
29int queue[n*n];//
佇列30
int front = 0;//
頭指標31
int rear = 0;//
尾指標32
33int x = 0;//
起點x座標
34int y = 0;//
起點y座標
35 queue[++rear] = 0;//
向佇列新增第乙個點,即起始點
36 visited[x][y] = 1;//
0結點被訪問過
3738
int prev[n*n];//
保留每個點的前結點
39 memset(prev, -1, sizeof(prev));//
初始化為-1
40 prev[0] = -1;//
0的前結點為-1
4142
while (front <=rear)
4362}63
}64 print(n*n - 1
, prev);65}
6667
intmain()
6879
if (i == 5)80
84}85return0;
86 }
POJ3984 迷宮問題
題目 迷宮問題 time limit 1000ms memory limit 65536k total submissions 3183 accepted 1861 description 定義乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎...
POJ 3984 迷宮問題
一道比較簡單的bfs題 include include include include define max 6 using namespace std int map max max px max max py max max int movex 4 movey 4 bool vis max ma...
POJ 3984 迷宮問題
迷宮問題 time limit 1000ms memory limit 65536k total submissions 7047 accepted 4123 description 定義乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,...