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 19 Python
两个命令把 Vim 打造成 Python IDE的方法
Mar 20 Python
[原创]教女朋友学Python(一)运行环境搭建
Nov 29 Python
Python中str.join()简单用法示例
Mar 20 Python
Python中的函数式编程:不可变的数据结构
Oct 08 Python
在python中利用GDAL对tif文件进行读写的方法
Nov 29 Python
python的faker库用法
Nov 28 Python
Python 去除字符串中指定字符串
Mar 05 Python
Django实现从数据库中获取到的数据转换为dict
Mar 27 Python
django迁移文件migrations的实现
Mar 31 Python
django 外键创建注意事项说明
May 20 Python
BeautifulSoup获取指定class样式的div的实现
Dec 07 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
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
2017/06/07 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
2019/10/15 PHP
Javascript 面向对象之重载
2010/05/04 Javascript
javascript forEach通用循环遍历方法
2010/10/11 Javascript
理解Javascript_09_Function与Object
2010/10/16 Javascript
检测一个函数是否是JavaScript原生函数的小技巧
2015/03/13 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
2015/03/30 Javascript
延时加载JavaScript代码提高速度
2015/12/27 Javascript
js date 格式化
2017/02/15 Javascript
Angular利用trackBy提升性能的方法
2018/01/26 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
JS实现监控微信小程序的原理
2018/06/15 Javascript
探秘vue-rx 2.0(推荐)
2018/09/21 Javascript
浅谈开发eslint规则
2018/10/01 Javascript
JavaScript遍历DOM元素的常见方式示例
2019/02/16 Javascript
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
Python正则表达式匹配HTML页面编码
2015/04/08 Python
Python中使用插入排序算法的简单分析与代码示例
2016/05/04 Python
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
python找出列表中大于某个阈值的数据段示例
2019/11/24 Python
Python使用matplotlib绘制圆形代码实例
2020/05/27 Python
python+flask编写一个简单的登录接口
2020/11/13 Python
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
公务员个人自我评价分享
2013/11/06 职场文书
公司培训心得体会
2014/01/03 职场文书
人力资源管理毕业生自荐信
2014/06/26 职场文书
2014最新自愿离婚协议书范本
2014/11/19 职场文书
高中社区服务活动报告
2015/02/05 职场文书
民政工作个人总结
2015/02/28 职场文书
2015年全国助残日活动方案
2015/05/04 职场文书
催款函怎么写
2015/06/24 职场文书
处世之道:关于真诚相待的名言推荐
2019/12/02 职场文书
Python实现列表拼接和去重的三种方式
2021/07/02 Python
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python