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 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)


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
        #四个方向
        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)

在这里插入图片描述

发布了235 篇原创文章 · 获赞 8 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览