python迷宫问题深度优先遍历实例


Posted in Python onJune 20, 2021

一、迷宫介绍

用python解迷宫问题,迷宫是一个二维列表,本次用深度优先解开迷宫问题。定义起点和终点,从一个位置到下一个位置只能通过向上或下或左或右,走一步来实现,从起点出发,如何找到一条到达终点的通路。

二、深度优先遍历

简单那我们的案例来讲就是,随便选择一条路,一直走,走不动了,再回头重新选择新的路

# 1 为墙,0 为路
maze = [
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 0, 1, 1, 0, 0, 0, 1, 1, 1],
    [1, 0, 1, 1, 1, 1, 0, 0, 1, 1],
    [1, 0, 1, 0, 0, 0, 0, 0, 1, 1],
    [1, 0, 1, 0, 1, 1, 1, 1, 1, 1],
    [1, 0, 0, 0, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 0, 0, 0, 0, 1, 1, 1],
    [1, 1, 1, 0, 0, 1, 0, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 0, 0, 0, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
]

首先我们先设置一个起点和终点

start = (1, 1)
end = (8, 8)

判断当前这个点,0就是路可以走,1为墙不能走
对于一个点的下一个点的坐标准说明:

  • 上走:r - 1, c
  • 下走:r + 1, c
  • 左走:r, c - 1
  • 右走:r, c + 1

那我们这个迷宫的某个一个点达到了不能走的地步了,就是死胡同了,它就得原路返回

这时我们就有一个概念,就是栈,栈的思想就是:先进后出

怎么理解呢,可以举一个小例子,就是食堂阿姨,每天早上蒸包子,他是一层一层放蒸笼
那放到最后,学生来吃包子,她是从上往往外拿,最上面就是最后放的,最下面是最先放的,所以就叫做先进后出

其实list就是一个栈,比如我们放一个空列表,然后我们用这个列表直接append

再用pop进行取出,就会取到append的最后一个元素

# 定义列表,列表里面放的就是每一步走的坐标,[r, c]
# 第一步就是起始位置,也就是start
list01 = [start]

走过的路定义为2

row, col = now
# python 里的解构也叫解包 now包括两个位置,一个行,一个列
maze[row][col] = 2
# 这个代表就是走过的点,为2,因为你走过的路是不能再走的,除了走不通返回的时候,也是为了走不通按原来走过的路原路返回

核心代码:

if maze[row - 1][col] == 0:
    # 上方可以走
    list01.append((row - 1, col))
    continue
elif maze[row][col + 1] == 0:
    # 右方可以走
    list01.append((row, col + 1))
    continue
elif maze[row + 1][col] == 0:
    # 下方可以走
    list01.append((row + 1, col))
    continue
elif maze[row][col - 1] == 0:
    # 左方可以走
    list01.append((row, col - 1))
    continue

最终代码,可以运行一下试试:

maze = [
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 0, 1, 1, 0, 0, 0, 1, 1, 1],
    [1, 0, 1, 1, 1, 1, 0, 0, 1, 1],
    [1, 0, 1, 0, 0, 0, 0, 0, 1, 1],
    [1, 0, 1, 0, 1, 1, 1, 1, 1, 1],
    [1, 0, 0, 0, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 0, 0, 0, 0, 1, 1, 1],
    [1, 1, 1, 0, 0, 1, 0, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 0, 0, 0, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
]

start = (1, 1)
end = (8, 8)

# 定义列表,列表里面放的就是每一步走的坐标,[r, c]
# 第一步就是起始位置,也就是start
list01 = [start]

# 定义循环,让它走
# 列表里最后存的就是下一步走的地方,当前列表有东西才能继续走
while list01:
    # 当前走到的节点是哪一个节点,也就是最后走的一步,是哪一步,去列表的最后的一个值就是索引-1
    now = list01[-1]
    if now == end:  # 如果现在的now等于我们之前定义的终点end
        print(list01)
        print("出来了")
        break
    row, col = now
    # python 里的解构也叫解包 now包括两个位置,一个行,一个列
    maze[row][col] = 2
    # 这个代表就是走过的点,为2,因为你走过的路是不能再走的,除了走不通返回的时候,也就是为了走不通按原来走过的路原路返回

	# continue 结束本次循环,从新开始判断走路
    if maze[row - 1][col] == 0:
        # 上方可以走
        list01.append((row - 1, col))
        continue
    elif maze[row][col + 1] == 0:
        # 右方可以走
        list01.append((row, col + 1))
        continue
    elif maze[row + 1][col] == 0:
        # 下方可以走
        list01.append((row + 1, col))
        continue
    elif maze[row][col - 1] == 0:
        # 左方可以走
        list01.append((row, col - 1))
        continue
    else: # 走不通过,直接循环干掉每一步,重新调整路线
        list01.pop()

else:
    print("这个迷宫走不通")

总结

到此这篇关于python迷宫问题深度优先遍历的文章就介绍到这了,更多相关python迷宫深度优先内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python字符串连接方式汇总
Aug 21 Python
浅谈Python 对象内存占用
Jul 15 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
Jun 28 Python
Django 中使用流响应处理视频的方法
Jul 20 Python
python 产生token及token验证的方法
Dec 26 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
Jan 15 Python
python实现ftp文件传输系统(案例分析)
Mar 20 Python
PyInstaller的安装和使用的详细步骤
Jun 02 Python
浅析Python模块之间的相互引用问题
Feb 26 Python
python 实现有道翻译功能
Feb 26 Python
python opencv旋转图片的使用方法
Jun 04 Python
Python学习之异常中的finally使用详解
Mar 16 Python
Python虚拟环境virtualenv是如何使用的
Python机器学习之底层实现KNN
Jun 20 #Python
利用python进行数据加载
Jun 20 #Python
Python编解码问题及文本文件处理方法详解
浅谈Python协程asyncio
Jun 20 #Python
Python3接口性能测试实例代码
Jun 20 #Python
使用Djongo模块在Django中使用MongoDB数据库
You might like
espresso double下 咖啡粉超细时 饼压力对咖啡的影响
2021/03/03 冲泡冲煮
php imagecreatetruecolor 创建高清和透明图片代码小结
2010/05/15 PHP
PHP下通过file_get_contents的代理使用方法
2011/02/16 PHP
javascript mouseover、mouseout停止事件冒泡的解决方案
2009/04/07 Javascript
jquery 仿QQ校友的DIV模拟窗口效果源码
2010/03/24 Javascript
利用JQuery的load函数动态加载其它页面的内容的实现代码
2010/12/14 Javascript
jQuery autocomplate 自扩展插件、自动完成示例代码
2011/03/28 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
2015/04/16 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
使用Math.max,Math.min获取数组中的最值实例
2017/04/25 Javascript
redux-saga 初识和使用
2018/03/10 Javascript
详解angular2.x创建项目入门指令
2018/10/11 Javascript
vue文件运行的方法教学
2019/02/12 Javascript
基于JS实现数字动态变化显示效果附源码
2019/07/18 Javascript
基于Web Audio API实现音频可视化效果
2020/06/12 Javascript
JS实现百度搜索框
2021/02/25 Javascript
[01:06:59]完美世界DOTA2联赛PWL S2 Magma vs FTD 第一场 11.29
2020/12/02 DOTA
windows下wxPython开发环境安装与配置方法
2014/06/28 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
python中比较两个列表的实例方法
2019/07/04 Python
解决django中ModelForm多表单组合的问题
2019/07/18 Python
Python导入数值型Excel数据并生成矩阵操作
2020/06/09 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
python 模拟登录B站的示例代码
2020/12/15 Python
浅谈Python xlwings 读取Excel文件的正确姿势
2021/02/26 Python
酒店管理专业毕业生推荐信
2013/11/10 职场文书
乌鸦喝水教学反思
2014/02/07 职场文书
低碳环保标语
2014/06/12 职场文书
珍惜资源的建议书
2014/08/26 职场文书
党的群众路线教育实践活动对照检查材料(四风)
2014/09/27 职场文书
健康状况证明书
2014/11/26 职场文书
财政局个人总结
2015/03/04 职场文书
军训阅兵新闻稿
2015/07/17 职场文书
python 标准库原理与用法详解之os.path篇
2021/10/24 Python
Netty分布式客户端接入流程初始化源码分析
2022/03/25 Java/Android
Web应用开发TypeScript使用详解
2022/05/25 Javascript