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中的函数编程
Apr 13 Python
使用Python编写一个简单的tic-tac-toe游戏的教程
Apr 16 Python
分享Python字符串关键点
Dec 13 Python
快速了解Python开发中的cookie及简单代码示例
Jan 17 Python
Sublime开发python程序的示例代码
Jan 24 Python
python删除不需要的python文件方法
Apr 24 Python
python实现时间o(1)的最小栈的实例代码
Jul 23 Python
django Admin文档生成器使用详解
Jul 22 Python
python绘图模块matplotlib示例详解
Jul 26 Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
Jun 02 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
Jun 27 Python
使用已经得到的keras模型识别自己手写的数字方式
Jun 29 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
解析thinkphp基本配置 convention.php
2013/06/18 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
jquery 经典动画菜单效果代码
2010/01/26 Javascript
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
2010/02/26 Javascript
jquery构造器的实现代码小结
2011/05/16 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
js propertychange和oninput事件
2014/09/28 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
干货分享:让你分分钟学会javascript闭包
2015/12/25 Javascript
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
JavaScript Date对象应用实例分享
2017/10/30 Javascript
详解vue-cli项目中用json-sever搭建mock服务器
2017/11/02 Javascript
js实现二级菜单点击显示当前内容效果
2018/04/28 Javascript
vue: WebStorm设置快速编译运行的方法
2018/10/18 Javascript
ios中视频的最后一桢问题解决
2019/05/14 Javascript
微信小程序如何刷新当前界面的实现方法
2019/06/07 Javascript
VUE实现移动端列表筛选功能
2019/08/23 Javascript
[51:05]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第一局
2016/03/06 DOTA
[45:17]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第三场 1月9日
2021/03/11 DOTA
Python yield使用方法示例
2013/12/04 Python
Python 类的继承实例详解
2017/03/25 Python
Python入门之三角函数atan2()函数详解
2017/11/08 Python
使用python爬虫获取黄金价格的核心代码
2018/06/13 Python
python 以16进制打印输出的方法
2018/07/09 Python
对pytorch网络层结构的数组化详解
2018/12/08 Python
使用CodeMirror实现Python3在线编辑器的示例代码
2019/01/14 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
2019/07/04 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
2020/03/09 Python
详解Python中Pyyaml模块的使用
2020/10/08 Python
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
音乐专业应届生教师求职信
2013/11/04 职场文书
2015年乡镇纪委工作总结
2015/05/26 职场文书
导游词之澳门玫瑰圣母堂
2019/12/03 职场文书
go:垃圾回收GC触发条件详解
2021/04/24 Golang
Java实战之课程信息管理系统的实现
2022/04/01 Java/Android