# 思路:从一个节点开始,任意找到下一个能走的点,当找不到能走的点时,退回上一个点寻找是否有其他方向的点。
# 方法:创建一个空栈,首先将入口位置进栈。当栈不空时循环:获取栈顶元素,寻找下一个可走的相邻方块,如果找不到可走的相邻方块,说明当前位置是死胡同
# ,进行回溯(就是讲当前位置出栈,看前面的点是否还有别的出路)
# 相关知识:深度优先搜索
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 stack_maze(x1,y1,x2,y2):
stack = []
stack.append((x1,y1))
maze[y1][x1] = -1 # 标记起点已经走过
while len(stack) > 0:
curNode = stack[-1]
if curNode == (x2,y2):
for i in stack:
print(i)
return True
for dir in dirs: # 找四个方向
nextNode = dir(*curNode) # *curNode 将curNode这个元组拆分成元素
if maze[nextNode[1]][nextNode[0]] == 0 :
# 找到下一格路
stack.append(nextNode)
maze[nextNode[1]][nextNode[0]] = -1 # 标记这格走过,防止死循环
break
else: # 四个方向都没找到,回溯
maze[curNode[1]][curNode[0]] = -1 # 标记死路一条,标记别走
stack.pop() # 回溯
print('死路')
return False
print(stack_maze(1,1,8,8))
数据结构-stack栈应用(走迷宫)
最新推荐文章于 2022-01-13 00:05:20 发布