老鼠走迷宮 - NKNU

Download Report

Transcript 老鼠走迷宮 - NKNU

8.4 迷宮(maze)
問題:一個迷宮有一個入口及一個出口,一隻老鼠欲從
入口走到出口,牠可採用何種策略走迷宮,又如何找到
最短路徑。
實例:在網頁 http://nknucc.nknu.edu.tw/~jwu/maze.html 有
一老鼠走迷宮的實例。迷宮僅有一入口,位於迷宮最上面
一行,可以用滑鼠點選最上面一行的方塊來改變入口的位
置。出口也只有一個,可以選在其他三面。角落是牆的一
部份,不能當入口及出口。迷宮內部也可以用滑鼠點選來
改變迷宮的通道,通道僅能一個方塊寬。按下「定位」,
老鼠會回到入口處;按下「出發」,老鼠會依縱向優先方
式尋找出口,第一次走過的通道會留下一道斜線,第二次
走過的通道會留下一個叉,以示無路可走;按下「最短路
徑」,如果有出路,老鼠會依最短路徑走出迷宮。
例:迷宮的資料結構。
左圖為一迷宮簡圖,由方塊排列而
成,以二維陣列 char maze[10][12] 表
之,共有 10 列 12 行。
maze[i][j]=0 表示第 i 列第 j 行是通道,
maze[i][j]=1 表示第 i 列第 j 行是牆壁。
入口是第 0 列第 4 行,出口是第 9
列第 7 行
下列每一對數表示第 i 列第 j 行是通道:
0 4
1 4
1 6 1 7 1 8 2 4
2 6
2 10 3 1 3 2 3 3 3 4 3 5 3 6
4 6 4 10 5 3 5 5 5 6 5 7
5 8
6 4 6 5
6 9 7 1 7 2 7 3 7 7
8 2 8 7 9 7
2
3
5
7
8
10
9
8
2
4
6
7
9
3
3
9
以縱向優先的方式來處理迷宮路徑搜尋的問題,我們需要:
 一個迷宮陣列 maze[i][j]。
 一個堆疊 s,將走訪的位置第 i 列第 j 行 (i, j) push 到堆疊,
將無路可走的位置 pop 出堆疊,最後搜尋的路徑就是存在堆
疊的資料。
 一個二維陣列 visit 記錄迷宮位置尚未走訪、走訪過與無路
可走的資料,分別以 0,1,2 表示。
 每走一步,都要上下左右檢查有無通路,一有通路就繼續
往前進行。
迷宮最短路徑的問題,以橫向優先的方式來搜尋,我們需要:
 一個迷宮陣列 maze[i][j]。
 一個佇列 q,每 Dequeue 一次,取得一個走訪的位置第 i
列第 j 行 (i, j),迷宮中所有與 (i, j) 相鄰且未走訪的位置全部
Enqueue 到佇列 q。
 一個二維陣列 visit 記錄迷宮位置尚未走訪、走訪過與無路
可走的資料,分別以 0,1,2 表示。
 一個二維陣列 parent[i][j] 記錄老鼠走訪第 i 列第 j 行 (i, j)
之前的位置。