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中封装GObject模块进行图形化程序编程的教程
Apr 14 Python
Python随机生成信用卡卡号的实现方法
May 14 Python
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
Sep 21 Python
解决python3 urllib中urlopen报错的问题
Mar 25 Python
python机器学习库常用汇总
Nov 15 Python
Python判断文件和字符串编码类型的实例
Dec 21 Python
在python中获取div的文本内容并和想定结果进行对比详解
Jan 02 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
Feb 29 Python
Python键鼠操作自动化库PyAutoGUI简介(小结)
May 17 Python
python 使用csv模块读写csv格式文件的示例
Dec 02 Python
python 通过exifread读取照片信息
Dec 24 Python
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
Apr 14 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
PHP中static关键字以及与self关键字的区别
2015/07/01 PHP
php使用curl并发减少后端访问时间的方法分析
2016/05/12 PHP
php、java、android、ios通用的3des方法(推荐)
2016/09/09 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
htm调用JS代码
2007/03/15 Javascript
Javascript对象中关于setTimeout和setInterval的this介绍
2012/07/21 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
FireBug 调试JS入门教程 如何调试JS
2013/12/23 Javascript
上传文件返回的json数据会被提示下载问题解决方案
2014/12/03 Javascript
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
javascript实现简单的分页特效
2015/08/12 Javascript
js实现文字闪烁特效的方法
2015/12/17 Javascript
JQuery解析XML的方法小结
2016/04/02 Javascript
搭建简单的nodejs http服务器详解
2017/03/09 NodeJs
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
WebStorm ES6 语法支持设置&babel使用及自动编译(详解)
2017/09/08 Javascript
vue实现中部导航栏布局功能
2019/07/30 Javascript
浅谈vue3中effect与computed的亲密关系
2019/10/10 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
Vue 电商后台管理项目阶段性总结(推荐)
2020/08/22 Javascript
Python如何快速实现分布式任务
2017/07/06 Python
Python with标签使用方法解析
2020/01/17 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
Python创建文件夹与文件的快捷方法
2020/12/08 Python
MoviePy简介及Python视频剪辑自动化
2020/12/18 Python
在C中是否有模拟继承等面向对象程序设计特性的好方法
2012/05/22 面试题
军训生自我鉴定范文
2013/12/27 职场文书
竞争性谈判邀请书
2014/02/06 职场文书
经贸日语专业个人求职信范文
2014/04/29 职场文书
运动会班级口号
2014/06/09 职场文书
2015年英语教研组工作总结
2015/05/23 职场文书
董事会决议范本
2015/07/01 职场文书
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS
Python实现机器学习算法的分类
2021/06/03 Python