给定一个二维列表,表示迷宫的轮廓(0表示通道,1表示墙),用栈结构完成算法,求一条走出迷宫的路径。
实现思路:回溯法,从一个点开始,任意找一个能走的点,当找到不能走的点时,退回上一个点寻找是否有其他方向的点。
代码示例
maze = [
[0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 1, 1, 0, 0, 0, 1, 0, 1],
[1, 0, 1, 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, 0, 0],
]
# 定义方向匿名函数
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), # 上
]
def search_path(x1, y1, x2, y2):
# 用列表模拟栈结构,只用append和pop操作
stack = []
# 压入起始位置
stack.append((x1, y1))
# 栈空表示没有路
while len(stack) > 0:
# 取当前位置
cur_x, cur_y = stack[-1]
# 已经到达终点时停止
if cur_x == x2 and cur_y == y2:
return stack
# 四个方向尝试
for dir in dirs:
# 获取下一个点
next_x, next_y = dir(cur_x, cur_y)
# 保证不出界
if 0 <= next_x < len(maze[0]) and 0 <= next_y < len(maze):
# 0表示能走通
if maze[next_y][next_x] == 0:
# 往能走通的方向走一步
stack.append((next_x, next_y))
# 记录已经走过,防止重复
maze[next_y][next_x] = 2
break
else: # 四个方向都走不通,死路,回退
stack.pop()
# 设置已经尝试过了,走不通
maze[cur_y][cur_x] = 3
else:
return None
path = search_path(0, 0, 9, 9)
print(path)
本文为 陈华 原创,欢迎转载,但请注明出处:http://www.chenhuax.com/read/305