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局部赋值的规则
Mar 07 Python
Python下的Softmax回归函数的实现方法(推荐)
Jan 26 Python
Python中的pack和unpack的使用
Mar 12 Python
python 定时修改数据库的示例代码
Apr 08 Python
Python基于多线程操作数据库相关问题分析
Jul 11 Python
详解numpy的argmax的具体使用
May 27 Python
python编写简单端口扫描器
Sep 04 Python
使用matlab或python将txt文件转为excel表格
Nov 01 Python
python实现控制台输出彩色字体
Apr 05 Python
浅析Python __name__ 是什么
Jul 07 Python
解决pytorch-gpu 安装失败的记录
May 24 Python
python实现自定义日志的具体方法
May 28 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中两种缩放图片的函数,为图片添加水印
2013/06/14 PHP
php通过递归方式复制目录和子目录的方法
2015/03/13 PHP
屏蔽PHP默认设置中的Notice警告的方法
2016/05/20 PHP
PHP+MySql+jQuery实现的"顶"和"踩"投票功能
2016/05/21 PHP
PHP第三方登录―QQ登录实现方法
2017/02/06 PHP
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
JavaScript获取XML数据附示例截图
2014/03/05 Javascript
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
轻量级的原生js日历插件calendar.js使用指南
2015/04/28 Javascript
javascript中offset、client、scroll的属性总结
2015/08/13 Javascript
jquery对复选框(checkbox)的操作汇总
2016/01/13 Javascript
使用AJAX实现Web页面进度条的实例分享
2016/05/06 Javascript
js动态添加的DIV中的onclick事件简单实例
2016/07/25 Javascript
使用OPENLAYERS3实现点选的方法
2020/09/24 Javascript
微信小程序tabBar底部导航中文注解api详解
2017/08/16 Javascript
详解Angular6 热加载配置方案
2018/08/18 Javascript
js动态添加带圆圈序号列表的实例代码
2021/02/18 Javascript
[12:29]《一刀刀一天》之DOTA全时刻19:蝙蝠骑士田伯光再度不举
2014/06/10 DOTA
Python中Django框架下的staticfiles使用简介
2015/05/30 Python
Python3中的2to3转换工具使用示例
2015/06/12 Python
Python实现股市信息下载的方法
2015/06/15 Python
Python计时相关操作详解【time,datetime】
2017/05/26 Python
pytorch + visdom 处理简单分类问题的示例
2018/06/04 Python
Python中使用__new__实现单例模式并解析
2019/06/25 Python
Django项目使用CircleCI的方法示例
2019/07/14 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
2020/01/10 Python
python判断变量是否为列表的方法
2020/09/17 Python
python3从网络摄像机解析mjpeg http流的示例
2020/11/13 Python
建筑学推荐信
2013/11/03 职场文书
劳资人员岗位职责
2013/12/19 职场文书
竞选部长演讲稿
2014/04/26 职场文书
质检员工作总结2015
2015/04/25 职场文书
初一年级组工作总结
2015/08/12 职场文书
理解python中装饰器的作用
2021/07/21 Python
Python内置数据类型中的集合详解
2022/03/18 Python