# 思路:从一个节点开始,寻找所有下一个能继续走的点,根据下一个的点继续寻找所有能走的点,直到该点等于出口。
# 方法:创建一个空队列,将起点位置进队。在队列不为空的时候循环:出队一次。如果当前位置为出口,则结束算法;
# 否则找出当前方块的4个相邻方块中可走的方块,加入队列。
# 和stack的优势:第一个出队的终点是最短路径
# 相关知识:广度优先搜索
from collections import deque
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),
]
#通过path找到最短路径
def shortest_path(path):
shortestpath = []
curNode = path[-1]
while curNode != path[0]:
shortestpath.append(curNode)
curNode = path[curNode[2]] # 根据第三个元素找到前一个点
shortestpath.append(path[0])
shortestpath.reverse()
return shortestpath
def stack_maze(x1,y1,x2,y2):
queue = deque()
path = []
queue.append((x1,y1,-1)) # 第三个元素记录找到的下一个点的上一个点的位置。
maze[y1][x1] = -1 # 标记起点已经走过
while len(queue) > 0:
curNode = queue.popleft()
path.append(curNode)
if curNode[0] == x2 and curNode[1] == y2:
print(shortest_path(path)) # 打印最短路径
return True
for dir in dirs: # 找四个方向
nextNode = dir(curNode[0],curNode[1])
if maze[nextNode[1]][nextNode[0]] == 0 :
# 找到下一格路
queue.append((*nextNode,len(path) -1))
maze[nextNode[1]][nextNode[0]] = -1 # 标记这格走过,防止死循环
print('死路')
return False
print(stack_maze(1,1,8,8))
数据结构-queue队列应用(走迷宫)
最新推荐文章于 2022-04-28 23:02:58 发布