用python深度優先遍歷解迷宮問題
導讀 | 這篇文章主要給大家介紹了關於python迷宮問題深度優先遍歷的相關資料,深度優先搜尋演算法(Depth-First-Search),是搜尋演算法的一種,需要的朋友可以參考下 |
一、迷宮介紹
用python解迷宮問題,迷宮是一個二維列表,本次用深度優先解開迷宮問題。定義起點和終點,從一個位置到下一個位置只能透過向上或下或左或右,走一步來實現,從起點出發,如何找到一條到達終點的通路。
二、深度優先遍歷
簡單那我們的案例來講就是,隨便選擇一條路,一直走,走不動了,再回頭重新選擇新的路
# 1 為牆,0 為路 maze = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 1, 0, 0, 0, 1, 1, 1], [1, 0, 1, 1, 1, 1, 0, 0, 1, 1], [1, 0, 1, 0, 0, 0, 0, 0, 1, 1], [1, 0, 1, 0, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 0, 0, 0, 1, 1, 1], [1, 1, 1, 0, 0, 1, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], ]
首先我們先設定一個起點和終點
start = (1, 1) end = (8, 8)
判斷當前這個點,0就是路可以走,1為牆不能走
對於一個點的下一個點的座標準說明:
- 上走:r - 1, c
- 下走:r + 1, c
- 左走:r, c - 1
- 右走:r, c + 1
那我們這個迷宮的某個一個點達到了不能走的地步了,就是死衚衕了,它就得原路返回
這時我們就有一個概念,就是棧,棧的思想就是:先進後出
怎麼理解呢,可以舉一個小例子,就是食堂阿姨,每天早上蒸包子,他是一層一層放蒸籠
那放到最後,學生來吃包子,她是從上往往外拿,最上面就是最後放的,最下面是最先放的,所以就叫做先進後出
其實list就是一個棧,比如我們放一個空列表,然後我們用這個列表直接append
再用pop進行取出,就會取到append的最後一個元素
# 定義列表,列表裡面放的就是每一步走的座標,[r, c] # 第一步就是起始位置,也就是start list01 = [start]
走過的路定義為2
row, col = now # python 裡的解構也叫解包 now包括兩個位置,一個行,一個列 maze[row][col] = 2 # 這個代表就是走過的點,為2,因為你走過的路是不能再走的,除了走不通返回的時候,也是為了走不通按原來走過的路原路返回
核心程式碼:
if maze[row - 1][col] == 0: # 上方可以走 list01.append((row - 1, col)) continue elif maze[row][col + 1] == 0: # 右方可以走 list01.append((row, col + 1)) continue elif maze[row + 1][col] == 0: # 下方可以走 list01.append((row + 1, col)) continue elif maze[row][col - 1] == 0: # 左方可以走 list01.append((row, col - 1)) continue
最終程式碼,可以執行一下試試:
maze = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 1, 0, 0, 0, 1, 1, 1], [1, 0, 1, 1, 1, 1, 0, 0, 1, 1], [1, 0, 1, 0, 0, 0, 0, 0, 1, 1], [1, 0, 1, 0, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 0, 0, 0, 1, 1, 1], [1, 1, 1, 0, 0, 1, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], ] start = (1, 1) end = (8, 8) # 定義列表,列表裡面放的就是每一步走的座標,[r, c] # 第一步就是起始位置,也就是start list01 = [start] # 定義迴圈,讓它走 # 列表裡最後存的就是下一步走的地方,當前列表有東西才能繼續走 while list01: # 當前走到的節點是哪一個節點,也就是最後走的一步,是哪一步,去列表的最後的一個值就是索引-1 now = list01[-1] if now == end: # 如果現在的now等於我們之前定義的終點end print(list01) print("出來了") break row, col = now # python 裡的解構也叫解包 now包括兩個位置,一個行,一個列 maze[row][col] = 2 # 這個代表就是走過的點,為2,因為你走過的路是不能再走的,除了走不通返回的時候,也就是為了走不通按原來走過的路原路返回 # continue 結束本次迴圈,從新開始判斷走路 if maze[row - 1][col] == 0: # 上方可以走 list01.append((row - 1, col)) continue elif maze[row][col + 1] == 0: # 右方可以走 list01.append((row, col + 1)) continue elif maze[row + 1][col] == 0: # 下方可以走 list01.append((row + 1, col)) continue elif maze[row][col - 1] == 0: # 左方可以走 list01.append((row, col - 1)) continue else: # 走不透過,直接迴圈幹掉每一步,重新調整路線 list01.pop() else: print("這個迷宮走不通")
總結
到此這篇關於python迷宮問題深度優先遍歷的文章就介紹到這了。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2780436/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- dfs深度優先搜尋解決迷宮類問題(遍歷)
- js實現深度優先遍歷和廣度優先遍歷JS
- 深度優先遍歷,廣度優先遍歷實現物件的深拷貝物件
- 迷宮問題
- 廣度優先遍歷圖解圖解
- python 實現二叉樹的深度&&廣度優先遍歷Python二叉樹
- 圖的遍歷:深度優先搜尋與廣度優先搜尋
- 寬度優先遍歷
- 圖論系列之「深度優先遍歷及聯通分量」圖論
- 回溯法求迷宮問題
- POJ3984-迷宮問題
- 再來一篇深度優先遍歷/搜尋總結?
- 【PTA】鄰接矩陣儲存圖的深度優先遍歷矩陣
- 洛谷 p1605 迷宮問題 詳解
- python實現圖(基於圖的不同儲存方式)的深度優先(DFS)和廣度(BFS)優先遍歷Python
- POJ3984 迷宮問題【BFS】
- 使用A*演算法解迷宮最短路徑問題演算法
- 「Golang成長之路」迷宮的廣度優先搜尋Golang
- 二分搜尋樹系列之[ 深度優先-層序遍歷 (ergodic) ]Go
- 二分搜尋樹系列之「深度優先-層序遍歷 (ergodic) 」Go
- [SDOI2012] 走迷宮 題解
- Node中的兩種遍歷方式-深度優先和廣度優先(附Node刪除檔案例子進行詳解)
- golang學習筆記——迷宮的廣度優先搜尋Golang筆記
- 資料結構-樹以及深度、廣度優先遍歷(遞迴和非遞迴,python實現)資料結構遞迴Python
- 圖論系列之「基於深度優先遍歷的尋路演算法 (Path) 」圖論演算法
- Python迷宮生成器Python
- 迷宮問題——最短程式碼,不到70行
- 【dawn·資料結構】迷宮問題(C++)資料結構C++
- 簡單介紹Python迷宮生成和迷宮破解演算法Python演算法
- Python字典的遍歷,包括key遍歷/value遍歷/item遍歷/Python
- 解密迷宮問題:三種高效演算法Java實現,讓你輕鬆穿越未知迷宮解密演算法Java
- [省選聯考 2024] 迷宮守衛 題解
- 內容是超正統的迷宮RPG?PSP遊戲《迷宮旅人2》深度解析遊戲
- golang遍歷channel時return問題Golang
- PHP 解迷宮之 H 最小PHP
- 8.dfs--王子救公主(遍歷迷宮,王子和公主訪問過同一位置,即成功救公主)
- 非遞迴實現先序遍歷和中序遍歷遞迴
- (C++)資料結構實驗二——迷宮問題C++資料結構