python迷宮問題深度優先遍歷例項

2022-09-25 10:33:12 字數 3198 閱讀 2580

用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為牆不能走

對於乙個點的下乙個點的座標準說明:

那我們這個迷宮的某個乙個點達到了不能走的地步了,就是死胡同了,它就得原路返回

這時我們就有乙個概念,就是棧,棧的思想就是:先進後出

怎麼理解呢,可以舉乙個小例子,就是食堂阿姨,每天早上蒸包子,他是一層一層放蒸籠

那放到最後,學生來吃包子,她是從上往往外拿,最上面就是最後放的,最下面是最先放的,所以就叫做先進後出

其實list就是乙個棧,比如我們放乙個空列表,然後我們用這個列表直接append

再用pop進行取出,就會取到append的最後乙個元素

# 定義列表,列表裡面放的就是每一步走的座標,[r, c]

# 第一步就是起始位置,也就是start

list01 = [start]

走過的路定義為2

row, col = now

# pydblwgidlzsthon 裡的解構也叫解包 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))

c程式設計客棧ontinue

最終**,可以執行一下試試:

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("這個迷宮走不通")

深度優先搜尋DFS(迷宮問題)

問題及 給出迷宮的圖紙和初始終點位置,用dfs求最小步數。include using namespace std int n,m,p,q,min 99999999 int a 51 51 book 51 51 void dfs int x,int y,int step 順時針 右下左上 int tx...

DFS深度優先搜尋 迷宮問題

首先我們用乙個陣列來儲存這個迷宮,用 1 代表障礙物,用 0 代表可通行的路 define n 22 int maze n n 假設我們現在處於 x,y 點 x y 指 maze 陣列的行 列 對於接下來的每一條路徑,我們只能乙個乙個地去嘗試 我們可以先往右走,直到走不通的時候再退回來,然後再去嘗試...

深度優先 迷宮演算法

前一陣一直想寫這個程式,一直沒有有效的解決儲存路徑的問題。現在想到的辦法是用佇列儲存每個節點的下表來表示路徑。這個演算法解決問的問題是 建乙個迷宮 用矩陣表示m行,n列 期中矩陣的左上角 座標為 0,0的點 為入點,找尋到所有到 m 1,n 1 的所有不重複路徑,並列印出來。注釋如下 include...