廣度優先遍歷簡稱為DFS,是數據結構中比較常用的一個算法,主要原理是采用隊列先進先出的規則,一層一層的訪問圖的節點。而迷宮問題接近與遍歷,但是不同於遍歷,主要考慮是采用棧的形式標記路徑,並對當前節點和死胡同分別標記為2和3,對死胡同的節點彈出棧,這樣循環最終會找到一個路徑。當然,存在一個問題就是不一定是最優的路徑。
'''
Title:廣度優先遍歷探索迷宮
Date: 2018-04-18
Author:Jackie
Commont:
1、使用棧stack保存路徑
2、采用廣度優先遍歷,將當前節點(棧的頂點)可用的臨近節點全部壓棧,並標記為2
3、對於發現死胡同時,將當前節點彈出棧,並標記為3
4、不需要使用隊列,因為隊列主要實現遍歷,而不是最優化
'''
from collections import deque
matrix = [
[0, 1, 0, 0, 1],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 1, 0]
]
# dfs function
def dfs_fun(matrix, start, end):
stack = []
stack.append(start)
x, y = start
matrix[x][y] =2
forward = True
while stack:
pos = stack[-1]
if pos == end:
print("Had find last path")
return stack
xPos, yPos = pos
forward = False
if yPos+1 < len(matrix):
if matrix[xPos][yPos+1] ==0:
stack.append((xPos, yPos+1))
matrix[xPos][yPos+1] =2
forward = True
if xPos+1 < len(matrix) :
if matrix[xPos+1][yPos] ==0:
stack.append((xPos+1, yPos))
matrix[xPos+1][yPos] =2
forward = True
if xPos-1 >=0 :
if matrix[xPos-1][yPos] ==0:
stack.append((xPos-1, yPos))
matrix[xPos-1][yPos] =2
forward = True
if yPos-1>=0:
if matrix[xPos][yPos-1] ==0:
stack.append((xPos, yPos-1))
matrix[xPos][yPos-1] =2
forward = True
# bad road
if not forward:
x, y = stack.pop()
matrix[xPos][yPos] = 3
return False
if __name__ == '__main__':
result = dfs_fun(matrix, (0,0), (4,4))
print(result)
