Python解决走迷宫问题算法示例


Posted in Python onJuly 27, 2018

本文实例讲述了Python解决走迷宫问题算法。分享给大家供大家参考,具体如下:

问题:

输入n * m 的二维数组 表示一个迷宫
数字0表示障碍 1表示能通行
移动到相邻单元格用1步

思路:

深度优先遍历,到达每一个点,记录从起点到达每一个点的最短步数

初始化案例:

1   1   0   1   1
1   0   1   1   1
1   0   1   0   0
1   0   1   1   1
1   1   1   0   1
1   1   1   1   1

1 把图周围加上一圈-1 , 在深度优先遍历的时候防止出界
2 把所有障碍改成-1,把能走的地方改成0
3 每次遍历经历某个点的时候,如果当前节点值是0 把花费的步数存到节点里
                            如果当前节点值是-1 代表是障碍 不遍历它
                            如果走到当前节点花费的步数比里面存的小,就修改它

修改后的图:

-1      -1   -1  -1   -1   -1      -1
-1      0    0   -1    0    0      -1
-1      0   -1    0    0    0      -1
-1      0   -1    0   -1   -1      -1
-1      0   -1    0    0    0      -1
-1      0    0    0   -1    0      -1
-1      0    0    0    0    0      -1
-1      -1   -1  -1   -1   -1      -1

外周的-1 是遍历的时候防止出界的

默认从左上角的点是入口 右上角的点是出口

Python代码:

# -*- coding:utf-8 -*-
def init():
  global graph
  graph.append([-1,  -1, -1, -1, -1, -1,  -1])
  graph.append([-1,  0, 0, -1, 0, 0,  -1])
  graph.append([-1,  0, -1, 0, 0, 0,  -1])
  graph.append([-1,  0, -1, 0, -1, -1,  -1])
  graph.append([-1,  0, -1, 0, 0, 0,  -1])
  graph.append([-1,  0, 0, 0, -1, 0,  -1])
  graph.append([-1,  0, 0, 0, 0, 0,  -1])
  graph.append([-1,  -1, -1, -1, -1, -1,  -1])
#深度优先遍历
def deepFirstSearch( steps , x, y ):
  global graph
  current_step = steps + 1
  print(x, y, current_step )
  graph[x][y] = current_step
  next_step = current_step + 1
  '''
  遍历周围4个点:
    如果周围节点不是-1 说明 不是障碍 在此基础上:
        里面是0 说明没遍历过 我们把它修改成当前所在位置步数加1
        里面比当前的next_step大 说明不是最优方案 就修改它
        里面比当前next_step说明当前不是最优方案,不修改
  '''
  if not(x-1== 1 and y==1) and graph[x-1][y] != -1 and ( graph[x-1][y]>next_step or graph[x-1][y] ==0 ) : #左
    deepFirstSearch(current_step, x-1 , y )
  if not(x == 1 and y-1==1) and graph[x][y-1] != -1 and ( graph[x][y-1]>next_step or graph[x][y-1] ==0 ) : #上
    deepFirstSearch(current_step, x , y-1 )
  if not(x == 1 and y+1==1) and graph[x][y+1] != -1 and ( graph[x][y+1]>next_step or graph[x][y+1]==0 ) : #下
    deepFirstSearch(current_step, x , y+1 )
  if not(x+1== 1 and y==1) and graph[x+1][y] != -1 and ( graph[x+1][y]>next_step or graph[x+1][y]==0 ) : #右
    deepFirstSearch(current_step, x+1 , y )
if __name__ == "__main__":
  graph = []
  init()
  deepFirstSearch(-1,1,1)
  print(graph[1][5])

运行结果:

(1, 1, 0)
(1, 2, 1)
(2, 1, 1)
(3, 1, 2)
(4, 1, 3)
(5, 1, 4)
(5, 2, 5)
(5, 3, 6)
(4, 3, 7)
(3, 3, 8)
(2, 3, 9)
(2, 4, 10)
(1, 4, 11)
(1, 5, 12)
(2, 5, 13)
(2, 5, 11)
(4, 4, 8)
(4, 5, 9)
(5, 5, 10)
(6, 5, 11)
(6, 4, 12)
(6, 3, 13)
(6, 2, 14)
(6, 1, 15)
(6, 3, 7)
(6, 2, 8)
(6, 1, 9)
(6, 4, 8)
(6, 5, 9)
(6, 2, 6)
(6, 1, 7)
(6, 1, 5)
12

PS:本站还有一个无限迷宫游戏,基于JS实现,提供给大家参考一下:

在线迷宫小游戏:
http://tools.3water.com/games/migong

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python登陆asp网站页面的实现代码
Jan 14 Python
单链表反转python实现代码示例
Feb 08 Python
Python实现的knn算法示例
Jun 14 Python
python实现一个简单的udp通信的示例代码
Feb 01 Python
python 进程的几种创建方式详解
Aug 29 Python
python中bytes和str类型的区别
Oct 21 Python
win10下python2和python3共存问题解决方法
Dec 23 Python
Tensorflow 自定义loss的情况下初始化部分变量方式
Jan 06 Python
解决Tensorflow 内存泄露问题
Feb 05 Python
python对接ihuyi实现短信验证码发送
May 10 Python
Python基于pillow库实现生成图片水印
Sep 14 Python
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
Jun 22 Python
python保存文件方法小结
Jul 27 #Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
Jul 27 #Python
tensorflow 加载部分变量的实例讲解
Jul 27 #Python
Python基于递归算法求最小公倍数和最大公约数示例
Jul 27 #Python
Python切片操作深入详解
Jul 27 #Python
对Tensorflow中的变量初始化函数详解
Jul 27 #Python
JavaScript中的模拟事件和自定义事件实例分析
Jul 27 #Python
You might like
Zend的Registry机制的使用说明
2013/05/02 PHP
PHP实现适用于自定义的验证码类
2016/06/15 PHP
PHP删除二维数组中相同元素及数组重复值的方法示例
2017/05/05 PHP
PHP处理bmp格式图片的方法分析
2017/07/04 PHP
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
javascript中使用replaceAll()函数实现字符替换的方法
2010/12/25 Javascript
了解一点js的Eval函数
2012/07/26 Javascript
THREE.JS入门教程(1)THREE.JS使用前了解
2013/01/24 Javascript
Node.js模块封装及使用方法
2016/03/06 Javascript
Angular.js中$resource高大上的数据交互详解
2017/07/30 Javascript
原生JS实现瀑布流插件
2018/02/06 Javascript
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
解决layui的radio属性或别的属性没显示出来的问题
2019/09/26 Javascript
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
Python的Socket编程过程中实现UDP端口复用的实例分享
2016/03/19 Python
详解python之配置日志的几种方式
2017/05/22 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
2019/04/18 Python
python实现一行输入多个值和一行输出多个值的例子
2019/07/16 Python
关于PyTorch源码解读之torchvision.models
2019/08/17 Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
2020/01/03 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
tensorflow自定义激活函数实例
2020/02/04 Python
Python查找不限层级Json数据中某个key或者value的路径方式
2020/02/27 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
python和opencv构建运动检测器的实现
2021/03/03 Python
Vince官网:全球著名设计师品牌,休闲而优雅的服饰
2017/01/15 全球购物
党员思想汇报范文
2013/12/30 职场文书
巧克力蛋糕店创业计划书
2014/01/14 职场文书
一年级语文教学反思
2014/02/13 职场文书
聘任证明怎么写
2015/03/02 职场文书
社区环境卫生倡议书
2015/04/29 职场文书
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS
Apache Hudi集成Spark SQL操作hide表
2022/03/31 Servers
什么是css原子化,有什么用?
2022/04/24 HTML / CSS