数据结构-queue队列应用(走迷宫)

# 思路:从一个节点开始,寻找所有下一个能继续走的点,根据下一个的点继续寻找所有能走的点,直到该点等于出口。
# 方法:创建一个空队列,将起点位置进队。在队列不为空的时候循环:出队一次。如果当前位置为出口,则结束算法;
#       否则找出当前方块的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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值