使用队列解决迷宫问题(广度优先搜索 / 最短路径)

使用,队列,解决,迷宫,问题,广度,优先,搜索,路径 · 浏览次数 : 2

小编点评

**博客地址:** https://www.cnblogs.com/zylyehuo/# -*- coding: utf-8 -*- **程序简介:** 该程序提供了一种生成迷宫路径的方法。它使用队列算法和迷宫数据结构来找到从起点到终点的路径。 **程序步骤:** 1. **初始化迷宫:**创建一个包含迷宫数据的三维列表 `maze`。 2. **创建路径队列:**将起点和终点放入队列中,并设置其深度为 -1,表示未访问过。 3. **开始搜索路径:**从队列中取出第一个节点,将其加入路径中。 4. **扩展路径:**从当前节点的所有可访问的相邻节点中选择其中最安全的节点作为下一个节点。 5. **检查路径结束:**如果当前路径到终点,则打印路径并返回 True。 6. **处理已访问的节点:**标记已访问的节点,以便在搜索结束后进行清理。 7. **递归搜索:**如果当前节点不是终点,则扩展所有可访问的相邻节点,并将它们加入队列中。 **代码示例:** ```python 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] ] print_r(maze_path_queue(1, 1, 8, 8)) ``` **结果:** 该程序将输出以下路径: ``` [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] ``` **注意:** 该程序的复杂性与迷宫大小有关。对于更大的迷宫,搜索效率可能下降。

正文

博客地址:https://www.cnblogs.com/zylyehuo/

# -*- coding: utf-8 -*-

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


def print_r(path):
    real_path = []
    i = len(path) - 1
    while i >= 0:
        real_path.append(path[i][0:2])
        i = path[i][2]

    real_path.reverse()
    for node in real_path:
        print(node)


def maze_path_queue(x1, y1, x2, y2):
    queue = deque()
    queue.append((x1, y1, -1))
    path = []  # 存储路径
    while len(queue) > 0:  # 当队列不空时循环
        curNode = queue.popleft()
        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])
            if maze[nextNode[0]][nextNode[1]] == 0:
                queue.append((nextNode[0], nextNode[1], len(path) - 1))  # 后续节点进队,记录哪个节点带他来的
                maze[nextNode[0]][nextNode[1]] = 2  # 标记为已经走过
    else:
        print("没有路")
        return False


maze_path_queue(1, 1, 8, 8)  # 起点坐标和终点坐标

与使用队列解决迷宫问题(广度优先搜索 / 最短路径)相似的内容:

使用队列解决迷宫问题(广度优先搜索 / 最短路径)

博客地址:https://www.cnblogs.com/zylyehuo/ # -*- coding: utf-8 -*- from collections import deque maze = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 1, 0,

使用单调队列解决 “滑动窗口最大值” 问题

本文已收录到 GitHub · AndroidFamily,有 Android 进阶知识体系,欢迎 Star。技术和职场问题,请关注公众号 [彭旭锐] 私信我提问。 前言 大家好,我是小彭。 在上一篇文章中,我们介绍了单调栈这种特殊的栈结构,单调栈是一种非常适合处理 “下一个更大元素问题” 的数据结

使用 TestContainers 进行数据库集成测试

在软件开发过程中,集成测试是至关重要的一环。它确保不同组件之间的协作正常,并验证系统在整体上的功能和性能。然而,传统的集成测试往往需要依赖于外部资源,如数据库、消息队列等,这给测试环境的搭建和维护带来了一定的挑战。 为了解决这个问题,我们可以使用 TestContainers 这个强大的开源工具。T

[转帖]针对容器的nginx优化

针对容器的nginx优化 本篇文章介绍了 Nginx 在容器内使用遇到的CPU核数获取问题以及对应的解决方法。 回顾上篇文章:TCP 半连接队列和全连接队列 背景 容器技术越来越普遍,很多公司已经将容器技术作为基础架构的一部分,容器中可以运行任何软件,包括 Web Server、Applicatio

RocketMQ 之 IoT 消息解析:物联网需要什么样的消息技术?

前言: 从初代开源消息队列崛起,到 PC 互联网、移动互联网爆发式发展,再到如今 IoT、云计算、云原生引领了新的技术趋势,消息中间件的发展已经走过了 30 多个年头。 目前,消息中间件在国内许多行业的关键应用中扮演着至关重要的角色。随着数字化转型的深入,客户在使用消息技术的过程中往往同时涉及交叉场

[转帖]BPF CO-RE 示例代码解析

https://www.cnblogs.com/charlieroro/p/14357802.html 在BPF的可移植性和CO-RE一文的末尾提到了一个名为runqslower的工具,该工具用于展示在CPU run队列中停留的时间大于某一值的任务。现在以该工具来展示如何使用BPF CO-RE。 目

低代码与消息队列的完美融合:打造高效开发与通信的组合

引言 消息队列(Message Queue,MQ)是一种在分布式系统中实现应用程序间通信的中间件技术。它的核心作用在于通过异步处理的方式,使得发送消息的应用程序(生产者)与接收消息的应用程序(消费者)解耦,从而提升系统的伸缩性、可靠性以及性能。 在消息队列中,生产者将需要处理的任务封装成消息发送至消

Redis使用ZSET实现消息队列使用总结一

转载请注明出处: 目录 1.zset为什么可以做消息队列 2.zset实现消息队列的步骤 3.使用jedis实现消息队列示例 4.+inf与-inf 5.redis使用list与zset做消息队列有什么区别 1.zset为什么可以做消息队列 zset做消息队列的特性有: 有序性:zset中所有元素都

Redis使用ZSET实现消息队列使用总结二

转载请注明出处: 目录 1.redis 用zset做消息队列如何处理消息积压 2.redis分片并使用zset做消息队列 3. redis如何分片 4. redis使用java发送消息到zset队列并对消息进行分片处理 5. redis使用zset做消息队列时,有多个消费者同时消费消息怎么处理 6.

[转帖]Kafka常见使用场景与Kafka高性能之道

https://juejin.cn/post/6958997115012186119 消息队列使用场景 队列,在数据结构中是一种先进先出的结构,消息队列可以看成是一个盛放消息的容器,这些消息等待着各种业务来处理。 消息队列是分布式系统中重要的组件,kafka就可以看做是一种消息队列,其大致使用场景: