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笔记(2)
Oct 24 Python
python实现下载指定网址所有图片的方法
Aug 08 Python
详解用python实现简单的遗传算法
Jan 02 Python
python如何爬取个性签名
Jun 19 Python
Python对接六大主流数据库(只需三步)
Jul 31 Python
在tensorflow中实现屏蔽输出的log信息
Feb 04 Python
Python爬虫实现vip电影下载的示例代码
Apr 20 Python
python Socket网络编程实现C/S模式和P2P
Jun 22 Python
python爬虫多次请求超时的几种重试方法(6种)
Dec 01 Python
python 指定源路径来解决import问题的操作
Mar 04 Python
python微信智能AI机器人实现多种支付方式
Apr 12 Python
python和anaconda的区别
May 06 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
php5数字型字符串加解密代码
2008/04/24 PHP
PHP 获取目录下的图片并随机显示的代码
2009/12/28 PHP
动态刷新 dorado树的js代码
2009/06/12 Javascript
多个表单中如何获得这个文件上传的网址实现js代码
2013/03/25 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
javascript实现的HashMap类代码
2014/06/27 Javascript
javascript中对Date类型的常用操作小结
2016/05/19 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
JS实现全屏的四种写法
2016/12/30 Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
2017/06/13 Javascript
微信小程序 input输入及动态设置按钮的实现
2017/10/27 Javascript
讲解vue-router之命名路由和命名视图
2018/05/28 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
2019/05/05 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
Python深入学习之内存管理
2014/08/31 Python
使用wxPython获取系统剪贴板中的数据的教程
2015/05/06 Python
python 循环遍历字典元素的简单方法
2016/09/11 Python
python字典多键值及重复键值的使用方法(详解)
2016/10/31 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
2018/03/23 Python
Python函数装饰器实现方法详解
2018/12/22 Python
记录Python脚本的运行日志的方法
2019/06/05 Python
解决python 读取excel时 日期变成数字并加.0的问题
2019/10/08 Python
使用python实现画AR模型时序图
2019/11/20 Python
增大python字体的方法步骤
2020/07/05 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
受欢迎的大学生自我评价
2013/12/05 职场文书
网上开商店的创业计划书
2014/01/19 职场文书
淘宝客服自我总结鉴定
2014/01/25 职场文书
大专会计自我鉴定
2014/02/06 职场文书
2014年效能监察工作总结
2014/11/21 职场文书
莫言获奖感言(全文)
2015/07/31 职场文书
民警忠诚教育心得体会
2016/01/23 职场文书
判断Python中的Nonetype类型
2021/05/25 Python
Python+Tkinter制作专属图形化界面
2022/04/01 Python