自動走迷宮(2)–深度優先(非遞歸)算法

自動走迷宮(2)--深度優先(非遞歸)算法

       上一期的‘左手法則’走迷宮我稱之爲‘感性方式’,侷限性很大,而接下來的則是用算法來尋址的‘理性方式‘。這一期用深度優先(DFS)(非遞歸方式)來完成自動走迷宮。

       簡單科普幾個概念,官方解釋dogedoge自己看吧,說一下我自己的理解:首先是兩個基本算法深度優先遍歷(DFS)和廣度優先遍歷(BFS),對比着比較好理解,深度優先就是‘一個猛子扎到底’,忽略層級的,而廣度優先則是按層級一級一級遍歷的。還有要用到的兩個數據結構:棧與隊列,都是存放數據的容器,只是取數據的方式不同;棧爲‘後進先出’,要從末尾取數據;隊列則是‘先進先出’,要從頭部取數據。

       言歸正傳,用深度優先走迷宮就遍歷生成的地圖迷宮列表,尋找一條從起點到終點全是‘0’的路線。僞代碼如下:

(1)從迷宮起點節點V開始訪問

(2)訪問這個節點V,標記爲可行的路徑;

(3)從v的未被訪問的非”牆”鄰接點中選取一個頂點w,重複第二步。如果v沒有未訪問的非”牆”鄰接點,把這個節點的可行路徑標記移除,回溯至上一節點;

(4)重複上述第(2)、(3)步,直至遍歷到迷宮的出口節點。

 

       邏輯與生成迷宮是一樣的,非常簡單,只是圖像化語言的特點,代碼可能會很長,其他語言的話就簡潔多了,廢話不說了,直接上圖!~

 

    先初始化,設置好起點和終點位置。

 

自動走迷宮(2)--深度優先(非遞歸)算法

將起點壓棧,然後進入循環:

        取棧頂元素設置爲當前單元,標記爲已訪問;

        如果當前單元周圍有‘是路’並且‘未訪問’的鄰接單元(待處理列表項目數>0),選取第一個,將其壓棧。

        否則將當前單元出棧。

 

注意:返回當前單元周圍情況與生成迷宮方法類似,就是尋找有‘是路’並且‘未訪問’的單元,並把它們放入待處理列表,基於迷宮尋址方式,加入順序是“右-下-左-上”。

 

自動走迷宮(2)--深度優先(非遞歸)算法

       執行上面的方法後,棧內留下的元素就是從起點到終點各個能夠聯通的節點,將它們連線就大功告成了!~

 

自動走迷宮(2)--深度優先(非遞歸)算法

轉自公衆號:
嘻嘻哈哈學編程

發佈了352 篇原創文章 · 獲贊 275 · 訪問量 62萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章