问题:给定一个迷宫列表,以及起点终点坐标,判断能否走通,并打印路线。(‘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)