POJ 3984 迷宮問題 Dijkstra

2021-09-08 14:50:58 字數 2821 閱讀 4842

迷宮問題

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

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 //

記錄前趨頂點

對於上圖,我們的演算法可以大大簡化,因為每條路徑的權重都相等,由於dijkstra是按照廣度優先搜尋來進行遍歷的,因而在我們這,先到達這個點的路徑即為最短路徑(這裡對照上圖,在紙上畫一畫就可以體會到)。

對於第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表示可以走的路,只能橫著走或豎著走,...