[ python深度優先搜尋] 利用棧走迷宮
阿新 • • 發佈:2021-01-21
問題:給定一個迷宮列表,以及起點終點座標,判斷能否走通,並列印路線。(‘0’是通路)
maze = \
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],
[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],
[1, 0, 0, 0, 0, 1, 1, 0, 0, 1],
[1, 0, 1, 1, 1, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 1, 0, 0, 0, 0, 1],
[1, 0, 1, 0, 0, 0, 1, 0, 0, 1],
[ 1, 0, 1, 1, 1, 0, 1, 1, 0, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
def maze_path(x1, y1, x2, y2): # 起點終點
dirs = [
lambda x, y: (x + 1, y),
lambda x, y: (x, y + 1),
lambda x, y: (x - 1, y),
lambda x, y: (x, y - 1)
] # 四個方向
stack = [(x1, y1)] # 棧
while len(stack) > 0:
curNode = stack[-1]
if curNode[0] == x1 and curNode[1] == x2:
# 判斷走到終點了
for p in stack:
print(p) # 列印路線
return True
# 嘗試四個方向 上:x-1,y 下:x+1,y 左:x,y-1 右: x,y+1
for dir in dirs:
nextNode = dir(curNode[0], curNode[1])
if maze[nextNode[0]][nextNode[1]] == 0:
stack.append(nextNode)
maze[nextNode[0]][nextNode[1]] = 2
break
else: # 如果當前的路線走到死衚衕時,把當前節點標記成2,並且出棧
maze[nextNode[0]][nextNode[1]] = 2
stack.pop()
else:
print('走不通!')
return False
maze_path(1, 4, 8, 7)