所謂迷宮生成算法,就是用以生成隨機的迷宮的算法git
迷宮生成算法是處於這樣一個場景:github
一個row行,col列的網格地圖,一開始默認全部網格四周的牆是封閉的算法
要求在網格地圖邊緣,也就是網格的邊上打通2面牆數據結構
全部網格都至少保證網格周圍至少有一堵牆打通spa
全部網格都能經過打通的牆能造成一條通路.net
博主已實現RecursiveBacktracking(遞歸回溯),RecursiveSegmentation(遞歸分割),隨機Prim算法,Kruskal+並查集四種迷宮生成算法,這篇文章主要對這四種算法進行簡要的介紹blog
Github連接遞歸
空間:O(n),時間:O(n),n爲迷宮節點數row*col
以一個棧做爲輔助的數據結構,用以記錄打通區域的順序,用以回溯遊戲
一開始隨機在地圖中選擇一個區域,加入棧。ip
以後在以前選擇的區域周圍隨機選擇一個未打通的區域,將新選擇的區域和以前選擇區域的牆打通,並把新的區域的加入棧
若是四周的區域都打通,就讓棧出棧,將當期所選擇的區域設置棧新的棧頂,表示回退到上一個區域
以後遞歸的按以前的步驟選擇下一個區域直到全部區域都被打通
這種算法實現思路極爲簡單,但通路過於明顯,甚至有可能會出現上圖中的迷宮,很尷!!!
遞歸空間複雜度:O(row * col),最好時間複雜度:O(lgrow + lgcol),最壞時間複雜度O(row * col)
將矩形地圖用十字分紅四個小矩陣
在四個小矩形相鄰的四個面上各隨機打通一面牆,使通路導通。
而後對全部小矩形重複以前分割操做
若是矩陣已經沒法分割了,也就是行數或列數爲一時,就將矩陣內部的牆所有打通
生成的迷宮有明顯的矩造成分,不天然,適合簡單如FPS,ACT等遊戲
空間:O(row*col),時間:O(牆數=(row-1)*col+row*(col - 1))
隨機選擇一個區域做爲當前區域
將區域四周未打通的牆加入列表中
while(列表不爲空)
隨機從列表選擇一面牆
若是牆兩邊區域存在一區域未被打通,就打通這面牆,並將這面牆兩邊區域附近未打通的牆加入列表
從列表中移除這面牆
天然的迷宮,很難走,適合真正的迷宮遊戲
空間:O(row*col),時間:O(牆數=(row-1)*col+row*(col - 1))
這個算法巧妙的使用了並查集,運用並查集判斷整個迷宮的導通問題
把全部牆加入牆列表中
while(牆列表不爲空)
隨機從牆列表選擇一堵牆,用並查集判斷牆兩邊區域是否導通
不導通就打通這堵牆
從牆列表中移除這堵牆