迷宫问题 | 深度优先

news2025/1/22 21:49:43

目录

一、说明

二、步骤

三、代码

四、结果


一、说明

什么是深度优先?

        DFS即Depth First Search,深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,一般用堆数据结构来辅助实现DFS算法。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。

本文通过对10*10迷宫问题的解决,理解深度优先的代码逻辑策略。

操作系统:win 10

编辑器:pycharm edu

语言及版本:python 3.10

解决的问题:迷宫

使用的算法:深度优先

迷宫复杂度:10*10

替代迷宫:列表(1代表墙壁,0代表通道,即1不能走,0可以走)

存储容器:栈(python中的列表可实现栈的功能,先进后出)

可走出迷宫路线数量:2

迷宫图:

[

[0, 0, 1, 1, 1, 1, 1, 1, 1, 1],

[0, 0, 1, 1, 0, 0, 0, 0, 1, 1],

[1, 0, 0, 0, 0, 1, 1, 0, 1, 1],

[1, 1, 1, 0, 0, 1, 1, 0, 1, 1],

[1, 1, 1, 0, 0, 1, 1, 0, 0, 1],

[1, 1, 1, 1, 0, 0, 1, 0, 0, 1],

[1, 1, 1, 1, 1, 0, 0, 1, 0, 1],

[1, 1, 1, 1, 1, 1, 0, 0, 0, 1],

[1, 1, 1, 1, 1, 1, 0, 1, 0, 1],

[1, 1, 1, 1, 1, 1, 0, 0, 0, 0],

]

逻辑:

先确定当前节点,在判断当前节点上下左右是否是墙壁(要去除掉之前走过的节点,避免走死循环),往上下左右的优先级看实际情况,不是墙壁即把这个点入栈,并把这个当做当前节点,循环反复,直到当前点坐标等于终点坐标即为走出迷宫;

如何判断迷宫是否可以走出?

1)若迷宫可以走出,则当前节点坐标等于终点坐标;

2)若迷宫无法走出,则记录坐标的容器为空;

注意:当走到某一条死路进行后退时,要把回退的节点出栈,直到下一条路线为止;

二、步骤

2.1、创建迷宫并确认起始点和终点

    # 创建迷宫
    maze_pic = [
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        [1, 0, 1, 1, 0, 0, 0, 0, 1, 1],
        [1, 0, 0, 0, 0, 1, 1, 0, 1, 1],
        [1, 1, 1, 0, 0, 1, 1, 0, 1, 1],
        [1, 1, 1, 0, 0, 1, 1, 0, 0, 1],
        [1, 1, 1, 1, 0, 0, 1, 0, 0, 1],
        [1, 1, 1, 1, 1, 0, 0, 1, 0, 1],
        [1, 1, 1, 1, 1, 1, 0, 0, 0, 1],
        [1, 1, 1, 1, 1, 1, 0, 0, 0, 1],
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    ]
    # 确定起点
    stat = (0, 0)
    # 确定终点,索引值从0开始,0-9=10
    stop = (8, 8)

2.2、取出当前节点并记录

        now = lst[-1]
        row, col = now  # 取出当前节点
        # 9表示当前节点已走过,设置什么数字或者字母无所谓,只要不是0即可
        maze_pic[row][col] = 9  

2.3、走出迷宫的条件并判断各个方向是否能走并记录节点

        if now == stop:
            print("迷宫已走出,走过的路线为:\n", lst)
            break
        if maze_pic[row-1][col] == 0:  # 上
            lst.append((row-1, col))  # 记录节点
            continue
        elif maze_pic[row+1][col] == 0:  # 下
            lst.append((row+1, col))
            continue
        elif maze_pic[row][col-1] == 0:  # 左
            lst.append((row, col-1))
            continue
        elif maze_pic[row][col+1] == 0:  # 右
            lst.append((row, col+1))
            continue
        else:
            lst.pop()

三、代码

完整代码如下:



def maze_question():
    # 创建迷宫
    maze_pic = [
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        [1, 0, 1, 1, 0, 0, 0, 0, 1, 1],
        [1, 0, 0, 0, 0, 1, 1, 0, 1, 1],
        [1, 1, 1, 0, 0, 1, 1, 0, 1, 1],
        [1, 1, 1, 0, 0, 1, 1, 0, 0, 1],
        [1, 1, 1, 1, 0, 0, 1, 0, 0, 1],
        [1, 1, 1, 1, 1, 0, 0, 1, 0, 1],
        [1, 1, 1, 1, 1, 1, 0, 0, 0, 1],
        [1, 1, 1, 1, 1, 1, 0, 0, 0, 1],
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    ]
    # 确定起点
    start = (1, 1)
    # 确定终点,索引值从0开始,0-9=10
    stop = (8, 8)
    # 判断逻辑
    lst = [start]
    # 走过的节点不为空时才继续判断下一步
    i = 0  # 计数
    while lst:
        i += 1
        now = lst[-1]
        row, col = now  # 取出当前节点
        # 9表示当前节点已走过,设置什么数字或者字母无所谓,只要不是0即可
        maze_pic[row][col] = 9
        if now == stop:
            print("走过节点数为:", i)
            print("迷宫已走出,走过的路线为:\n", lst)
            break
        if maze_pic[row-1][col] == 0:  # 上
            lst.append((row-1, col))
            continue
        elif maze_pic[row+1][col] == 0:  # 下
            lst.append((row+1, col))
            continue
        elif maze_pic[row][col-1] == 0:  # 左
            lst.append((row, col-1))
            continue
        elif maze_pic[row][col+1] == 0:  # 右
            lst.append((row, col+1))
            continue
        else:
            lst.pop()
    else:
        print("该迷宫无法走出")
        print("走过的节点个数为:", i)


if __name__ == '__main__':
    maze_question()

四、结果

4.1、代码运行结果

结果较长,只截取了部分,如下图1:

图1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/151540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

身兼数据科学家和自由职业者,算算我在2022赚了多少钱?

2022年,我作为自由职业者数据科学家赚了多少钱?长按关注《Python学研大本营》,加入读者群,分享更多精彩扫码关注《Python学研大本营》,加入读者群,分享更多精彩大家好,首先,我已经等了很久了。2…

保姆级 | 最新Burpsuite安装配置

文章目录 0x00 前言 0x01 环境说明 0x02 准备工作 0x03 安装JDK 0x04 配置JDK环境 0x05 Burpsuite安装 0x06 Burpsuite环境配置 0x07 Burpsuite设置代理 0x08 Burpsuite使用验证 0x09 总结 0x00 前言 Burp Suite 是用于攻击 web 应用程序的集成平台,包含了…

mongodb 中做 join 的方法

【问题】Imagine you have a collection for posts, and each of these posts has the attribute userid: ObjectId( ), where ObjectID is referencing a document in the Users collection.How would you go about retrieving the user information (in this case, the user …

GC耗时高,原因竟是服务流量小?

简介 最近,我们系统配置了GC耗时的监控,但配置上之后,系统会偶尔出现GC耗时大于1s的报警,排查花了一些力气,故在这里分享下。 发现问题 我们系统分多个环境部署,出现GC长耗时的是俄罗斯环境,…

高校舆情监控系统建设(TOOM)如何做好教育行业舆情监控方案?

高校作为高密度学生聚集地,舆情管理上,需要保持高度的警惕性。高校中大学生是活跃在互联网上的重要群体,他们作为文化水平较高、思维较活跃的特殊群体,其网络中的言论合集往往会引发社会关注。高校舆情监控系统建设(TOOM)如何做好…

Sapped of vitality 生机已被耗尽 | 经济学人社论高质量双语精翻

选自TE20221217,leaders The global economy:Sapped of vitality 世界经济:生机已被耗尽 Why are the rich world’s politicians giving up on economic growth? 为什么发达国家的政客们不再追求经济增长目标? The prospect of …

智能音箱app开发-广州app开发定制

科技高速发展,智能产品遍地都是。日常生活都是智能化时代,智能音箱app也开始被开发出来。为用户提供便捷的服务,优化体验。 智能音箱app开发特点 一:搭建快速 线上渠道在各个行业中不可或缺的,因为线上平台不管是流量…

nginx学习笔记3(小d课堂)

nginx访问日志的作用: 我们先去查看一下我们的nginx.conf文件: BAT大厂应用运维平台案例统计 awk 默认以空格进行分隔。 {print $1} 只取第一个属性 sort -n排序 sort -rn倒序 uniq -c去重 head -n 100取前100个。 自定义日志统计接口性能 我们修改完…

上半年要写的博客文章28

上半年要写的博客文章21 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个…

基于ESP32的蓝牙刷屏器自动点击器的制作

ESP32模块的选型: 这里是利用蓝牙连接手机来做点击器或刷屏器,ESP8266只有WIFI而ESP32有WIFI和蓝牙,所以选择ESP32模块。 ESP32模块可以选择ESP32-NodeMCU: 或ESP32-MiniKit: 这里使用的是ESP32 MINI KIT,Arduino环境下烧录选择如…

Nginx搭建Web服务器

环境: CentOS 7.2.1511 一、搭建静态web服务器 访问基本的静态页面(基于IP访问) 1.使用源码包编译安装nginx 启动ngin 直接在服务器测试访问: 访问nginx Web页面实现用户认证 修改nginx配置文件 2.生成密码文件&#xff…

64. 方法的值的传递及调用类内部的属性、方法

64. 方法的值的传递及调用类内部的属性、方法 文章目录64. 方法的值的传递及调用类内部的属性、方法1. 知识回顾2. 值的传递3. 没有值4. 需要向方法传递值5. 调用类内部的属性和方法6. 综合代码7. 类在爬虫中的应用7.1 创建类7.2 创建对象7.3 调用方法7.4 第2次调用方法7.5 第2…

MSE ZooKeeper 数据导入导出功能上线

作者:草谷 背景 MSE 提供了托管版的 ZooKeeper,拥有比自建开源 ZooKeeper 稳定性更高的SLA,同时管控面提供了丰富的服务自治功能。赶在2022年的岁末,MSE ZooKeeper 上线了一个非常实用的功能-数据导入导出功能,彻底解…

Mybatis自动生成增删改查代码

GitHub项目地址 Gitee项目地址 使用 mybatis generator 自动生成代码&#xff0c;实现数据库的增删改查。 1 配置Mybatis插件 在pom文件添加依赖&#xff1a; <plugins> <plugin><groupId>org.mybatis.generator</groupId><artifactId>myba…

宝塔面板Nginx开启Brotli压缩,提升网站加载速度

前言Google 认为互联网用户的时间是宝贵的&#xff0c;他们的时间不应该消耗在漫长的网页加载中&#xff0c;因此在 2015 年 9 月 Google 推出了无损压缩算法 Brotli。Brotli 通过变种的 LZ77 算法、Huffman 编码以及二阶文本建模等方式进行数据压缩&#xff0c;与 Gzip相比效率…

图解cross attention

英文参考链接&#xff1a; https://vaclavkosar.com/ml/cross-attention-in-transformer-architecture 交叉注意力与自我注意力 除了输入&#xff0c;cross-attention 计算与self-attention相同。交叉注意力不对称地组合了两个相同维度的独立嵌入序列&#xff0c;相比之下&a…

移动互联网社交江湖已定,抖音为何仍不放过微信?

进入2023年&#xff0c;抖音集团依然放不下“社交梦”。2022年12月30日&#xff0c;抖音官网上线了一款名为“抖音聊天”的桌面端聊天软件&#xff0c;提供Windows和Mac两个版本&#xff0c;进入软件需使用抖音App扫码登录。这并不是抖音集团首次推出社交产品。2019年以来&…

Day854.两阶段终止模式 -Java 并发编程实战

两阶段终止模式 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于两阶段终止模式的内容。 从纯技术的角度看&#xff0c;都是启动多线程去执行一个异步任务。既启动&#xff0c;那又该如何终止呢&#xff1f; 那如何优雅地终止线程&#xff0c;正所谓有始有终。在Ja…

Kafka 概念

Kafka 属于分布式的消息引擎系统&#xff0c;主要功能 &#xff1a;提供一套完备的消息发布与订阅解决方案 生产者和消费者都是客户端&#xff08;Clients&#xff09;&#xff1a; 生产者&#xff08;Producer&#xff09;&#xff1a;向主题发布消息的客户端应用程序消费者…

前端基础(九)_this基本使用、this指向判断、改变this指向的方法

前言&#xff1a; 看这个例子&#xff1a; 例&#xff1a;给所有的div标签都添加点击事件&#xff0c;并打印当前节点的内容 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compa…