最近聽聞數據結構與算法實踐課的老師又出了和上年一樣的選題,不禁想起了去年自己完成作業時的點點滴滴,遺憾當時沒有寫博客的習慣,之前的一些心得這一年實踐的過去也逐漸淡忘了,突然就有了總結一下的想法,希望能有新的收獲吧。
由於當時也沒注意保存,軟件完成過程中的一些文檔早已丟失了,幸運的是Winform版源碼還在,Unity3D版程序也還幸存,雖然由於時間緊張只完成了大概框架,但美觀程度也遠非Winform可以相比的,先上幾張軟件圖吧:
生成算法
軟件實現了普利姆算法、遞歸回溯算法、遞歸分割算法和深度遍歷圖算法四種算法來完成迷宮的生成,前兩種算法生成的迷宮本質上是一個二維矩陣網絡形式的生成樹,也就是說其中沒有回路,同時從左下角的起點到迷宮中的每一點都有且僅有一條路徑,遞歸分割法雖然不是生成樹算法但是同樣屬於沒有回路的迷宮生成算法,深度遍歷圖算法則來源於知網上的一篇論文,屬於圖的深度遍歷算法,生成的迷宮隨機性更強,路徑也不止一條,但不得不說的確扮相比較差。
普利姆算法迷宮(Prim)
遞歸分割算法(Recursive division)
遞歸回溯(Recursive backtracker)
深度遍歷圖(Deep traversal graph)
尋路算法
至於尋路算法,軟件實現了深度優先遍歷、廣度優先遍歷、和A-Star三種算法,前兩種自不必說,A-Star算法是一種啟發式搜索算法,移動時會評估向周圍八個方向行走的預期代價,實時選出更小代價的移動方向,不過因為生成的迷宮均為正方形迷宮且起點和終點固定為左上和右下,所以在本項目中,A-Star算法並未發揮出它應有的機智,效率與廣度優先基本相同。后兩種算法可以尋找到最短路徑,而深度優先則並不能展示。圖中綠色為正確路線,藍色為尋路過程中經過的路線。。(PS:設定為深度廣度四方向移動,A-Star八方向移動)
深度優先遍歷(DFS)
廣度優先遍歷(BFS)
A-Star
因為實例中的迷宮入口出口位置的特殊性,廣度優先在尋路過程中基本要走完全稱,顯得有些不太機智
本文章屬於綜述,后面的算法會分篇分別闡述。