用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...