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序列之list和tuple常用方法以及注意事项
Jan 09 Python
Python脚本判断 Linux 是否运行在虚拟机上
Apr 25 Python
使用Python的package机制如何简化utils包设计详解
Dec 11 Python
微信跳一跳python自动代码解读1.0
Jan 12 Python
python中的常量和变量代码详解
Jul 25 Python
Python中关键字global和nonlocal的区别详解
Sep 03 Python
Django处理Ajax发送的Get请求代码详解
Jul 29 Python
python关于调用函数外的变量实例
Dec 26 Python
Python 实现自动完成A4标签排版打印功能
Apr 09 Python
python自定义函数def的应用详解
Jun 03 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
Jul 03 Python
Python Pandas数据分析之iloc和loc的用法详解
Nov 11 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开源建站平台小结
2010/04/22 PHP
php IP转换整形(ip2long)的详解
2013/06/06 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
php实现查询功能(数据访问)
2017/05/23 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
js 自制滚动条的小例子
2013/03/16 Javascript
javascript使用smipleChart实现简单图表
2015/01/02 Javascript
javascript中键盘事件用法实例分析
2015/01/30 Javascript
Linux下编译安装php libevent扩展实例
2015/02/14 Javascript
javascript计时器详解
2015/02/28 Javascript
JQuery删除DOM节点的方法
2015/06/11 Javascript
JavaScript jquery及AJAX小结
2016/01/24 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
2016/10/26 Javascript
canvas绘制万花筒效果(代码分享)
2017/01/20 Javascript
react native带索引的城市列表组件的实例代码
2017/08/08 Javascript
Three.js实现绘制字体模型示例代码
2017/09/26 Javascript
详解Angular5 服务端渲染实战
2018/01/04 Javascript
解决layui中的form表单与button的点击事件冲突问题
2018/08/15 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
如何在Vue中使用CleaveJS格式化你的输入内容
2018/12/14 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
JavaScript 判断浏览器是否是IE
2021/02/19 Javascript
Python cx_freeze打包工具处理问题思路及解决办法
2016/02/13 Python
详解Python判定IP地址合法性的三种方法
2018/03/06 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
2018/04/19 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
python numpy生成等差数列、等比数列的实例
2020/02/25 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
Python通过socketserver处理多个链接
2020/03/18 Python
PyQt5事件处理之定时在控件上显示信息的代码
2020/03/25 Python
Keras之fit_generator与train_on_batch用法
2020/06/17 Python
sublime3之内网安装python插件Anaconda的流程
2020/11/10 Python
走群众路线学习心得体会
2014/10/31 职场文书
初中生散播谣言检讨书
2014/11/17 职场文书
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS