思想
使用栈来解决迷宫问题的思想是通过深度优先搜索算法来探索迷宫中的路径。栈的特点是后进先出,这正好符合深度优先搜索的思想,即先探索一个方向直到无法继续为止,然后回溯到上一个节点,再探索其他方向。
具体来说,使用栈的思想是从起点开始,将起点入栈,然后不断从栈中弹出位置进行移动并判断是否到达终点,如果没有到达终点则继续将可移动的位置入栈,直到栈为空或者找到了终点位置。当无法继续移动时,回溯到上一个节点,继续尝试其他方向,直到找到一条通往终点的路径或者所有可能的路径都被探索完毕。
代码实现
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]]
dirs = [
lambda x, y: (x + 1, y),
lambda x, y: (x - 1, y),
lambda x, y: (x, y + 1),
lambda x, y: (x, y - 1),
]
def maze_path(x1, y1, x2, y2):
stack = []
stack.append((x1, y1))
while len(stack) > 0:
curNode = stack[-1] # 将当前的位置保存下来
if curNode[0] == x2 and curNode[1] == y2:
# 说明走到了终点
for p in stack:
print(p)
return True
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:
maze[curNode[0]][curNode[1]] = 2
stack.pop()
else:
print("没有路")
return False
maze_path(1, 1, 8, 8)