上一期的‘左手法則’走迷宮我稱之爲‘感性方式’,侷限性很大,而接下來的則是用算法來尋址的‘理性方式‘。這一期用深度優先(DFS)(非遞歸方式)來完成自動走迷宮。
簡單科普幾個概念,官方解釋dogedoge自己看吧,說一下我自己的理解:首先是兩個基本算法深度優先遍歷(DFS)和廣度優先遍歷(BFS),對比着比較好理解,深度優先就是‘一個猛子扎到底’,忽略層級的,而廣度優先則是按層級一級一級遍歷的。還有要用到的兩個數據結構:棧與隊列,都是存放數據的容器,只是取數據的方式不同;棧爲‘後進先出’,要從末尾取數據;隊列則是‘先進先出’,要從頭部取數據。
言歸正傳,用深度優先走迷宮就遍歷生成的地圖迷宮列表,尋找一條從起點到終點全是‘0’的路線。僞代碼如下:
(1)從迷宮起點節點V開始訪問
(2)訪問這個節點V,標記爲可行的路徑;
(3)從v的未被訪問的非”牆”鄰接點中選取一個頂點w,重複第二步。如果v沒有未訪問的非”牆”鄰接點,把這個節點的可行路徑標記移除,回溯至上一節點;
(4)重複上述第(2)、(3)步,直至遍歷到迷宮的出口節點。
邏輯與生成迷宮是一樣的,非常簡單,只是圖像化語言的特點,代碼可能會很長,其他語言的話就簡潔多了,廢話不說了,直接上圖!~
先初始化,設置好起點和終點位置。
將起點壓棧,然後進入循環:
取棧頂元素設置爲當前單元,標記爲已訪問;
如果當前單元周圍有‘是路’並且‘未訪問’的鄰接單元(待處理列表項目數>0),選取第一個,將其壓棧。
否則將當前單元出棧。
注意:返回當前單元周圍情況與生成迷宮方法類似,就是尋找有‘是路’並且‘未訪問’的單元,並把它們放入待處理列表,基於迷宮尋址方式,加入順序是“右-下-左-上”。
執行上面的方法後,棧內留下的元素就是從起點到終點各個能夠聯通的節點,將它們連線就大功告成了!~
轉自公衆號:
嘻嘻哈哈學編程