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之编写简单简单连接数据库并执行查询操作
Feb 27 Python
Python和Perl绘制中国北京跑步地图的方法
Mar 03 Python
详解Python中 sys.argv[]的用法简明解释
Dec 20 Python
Python基于多线程操作数据库相关问题分析
Jul 11 Python
Python-Tkinter Text输入内容在界面显示的实例
Jul 12 Python
python爬虫selenium和phantomJs使用方法解析
Aug 08 Python
python实现的批量分析xml标签中各个类别个数功能示例
Dec 30 Python
使用Tkinter制作信息提示框
Feb 18 Python
python实现坦克大战
Apr 24 Python
Python用类实现扑克牌发牌的示例代码
Jun 01 Python
Python连接Impala实现步骤解析
Aug 04 Python
Python中常用的os操作汇总
Nov 05 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
探讨php中header的用法详解
2013/06/07 PHP
PHP实现动态添加XML中数据的方法
2018/03/30 PHP
jquery 查找新建元素代码
2010/07/06 Javascript
js call方法详细介绍(js 的继承)
2013/11/18 Javascript
jQuery实现DIV层收缩展开的方法
2015/02/27 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
2016/01/28 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
angular6.0开发教程之如何安装angular6.0框架
2018/06/29 Javascript
详解Python中的正则表达式
2018/07/08 Python
详解django中url路由配置及渲染方式
2019/02/25 Python
详解python校验SQL脚本命名规则
2019/03/22 Python
python中dict使用方法详解
2019/07/17 Python
Python循环实现n的全排列功能
2019/09/16 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
Python爬虫爬取微信朋友圈
2020/08/06 Python
python selenium xpath定位操作
2020/09/01 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
2020/12/22 Python
Puritan’s Pride(普丽普莱)官方网站:美国最大最全的保健品公司之一
2016/10/23 全球购物
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
世界上最好的精品店:Shoptiques
2018/02/05 全球购物
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
波兰运动鞋网上商店:Distance.pl
2020/07/30 全球购物
创业计划书中要认真思考的问题
2013/12/28 职场文书
自荐信格式简述
2014/01/25 职场文书
财务主管岗位职责
2014/02/28 职场文书
保护母亲河倡议书
2014/04/14 职场文书
师德模范事迹材料
2014/06/03 职场文书
优秀员工评优方案
2014/06/13 职场文书
优秀团员自我评价
2015/03/10 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
2016年学校爱国卫生月活动总结
2016/04/06 职场文书
基于tensorflow权重文件的解读
2021/05/26 Python
html5 录制mp3音频支持采样率和比特率设置
2021/07/15 Javascript