python 队列 广度优先搜索

在这里插入图片描述

刚开始队列里面只有1,1出队,2进队,2出队,3进队,3出队,4和5进队,4出队,6进队现在队列里面是5和6,5出队,7进队,队列里面现在是6和7,6出队,8和9进队,队列里面还有7、8、9,7出队10进队,队列里面还有8、9、10

出队 1 2 3 4 5 6 7

那个点让他来的 没有那我写个-1 0 1 2 2 3 4

出队序列 0 1 2 3 4 5 6 7 8 9 10

1出队
2进队,2出队,2是从哪来的从1过来,1呢是0
3进队,3出队,3是从哪来的从2来的 ,写1
4和5进队,4出队,4从哪来的从3的位置来,写2,
5出队,5从哪来的,从3来的,写2
6出队,6从哪来的,从4来的,写3
7出队 ,7从哪来的,从5来的,5在4号位置,7写4

在这里插入图片描述

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 print_r(path):
    #最后一个元素就是终点
    curNode = path[-1]

    #这是真正路径  这是一条到终点
    realpath = []

    #终点到起到走的  等于-1找的是最开始的
    while curNode[2] != -1:
        # 真正的路径 #意思就是 curNode[0],curNode[1]
        realpath.append(curNode[0:2])
        #下一个节点
        curNode = path[curNode[2]]

    #等于-1的点,那个点是起点
    realpath.append(curNode[0:2])  # 起点
    //反转
    realpath.reverse()
    #print(realpath)
    #列表循环打印
    for node in realpath:
        print(node)

//x1和y1 是起点的位置   x2和y2是终点的位置
def maze_path_queue(x1, y1, x2, y2):
    #创建队列
    queue = deque()

    #记录谁让它来的 ,列表  下标哪个元素让他来的
    path = []
    # 0是x 1是y ,谁让你来的记录一下  起点是-1
    queue.append((x1, y1, -1))

    #这个是从终点到起点 ,所以取最后一个值  只要队不空 
    while len(queue) > 0:
        #当前节点是队首,队首要出来,出队
        curNode = queue.popleft()
        #出队的节点放进去      0就是最后一个元素的下标      curNode存在path这个列表位置就是下标,curNode肯定存在最后一个位置,所有0就是存在最后一个位置
        path.append(curNode)
        if curNode[0] == x2 and curNode[1] == y2:
            # 终点
            print_r(path)
            return True
        #把curNode 后面的所有节点都放进队列,是个方向四个方向
        for dir in dirs:
            nextNode = dir(curNode[0], curNode[1])
            #能走等于0
            if maze[nextNode[0]][nextNode[1]] == 0:
                #能走进队,x  ,y ,谁让它来的    len(path) - 1最后一个元素的下标         nextNode是由curNode带进来的
                queue.append((nextNode[0], nextNode[1], len(path) - 1))  # 后续节点进队,记录哪个节点带他来的
                maze[nextNode[0]][nextNode[1]] = 2  # 标记为已经走过
    else:
        print("没有路")
        return False
# 谁让它来的是path当前最后一个, nextNode是由curNode带进来的,curNode存在path这个列表位置就是下标,curNode肯定存在path最后一个位置,所有就写path最后元素的位置

maze_path_queue(1, 1, 8, 8)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟伟哦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值