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通过解析网页实现看报程序的方法
Aug 04 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
Jun 27 Python
Scrapy的简单使用教程
Oct 24 Python
python实现机械分词之逆向最大匹配算法代码示例
Dec 13 Python
Python日志模块logging基本用法分析
Aug 23 Python
详解Python3 中的字符串格式化语法
Jan 15 Python
不到20行实现Python代码即可制作精美证件照
Apr 24 Python
python 实现PIL模块在图片画线写字
May 16 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
Aug 07 Python
Scrapy爬虫文件批量运行的实现
Sep 30 Python
Python Pandas数据分析工具用法实例
Nov 05 Python
matplotlib事件处理基础(事件绑定、事件属性)
Feb 03 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 Try Catch异常测试
2009/03/01 PHP
解析Win7 XAMPP apache无法启动的问题
2013/06/26 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
php根据指定位置和长度获得子字符串的方法
2015/03/17 PHP
js GridView 实现自动计算操作代码
2009/03/25 Javascript
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
利用JS延迟加载百度分享代码,提高网页速度
2013/07/01 Javascript
javascript自定义右键弹出菜单实现方法
2015/05/25 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
2016/06/07 Javascript
JS实现刷新父页面不弹出提示框的方法
2016/06/22 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
2016/06/27 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
微信小程序实现留言板
2018/10/31 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
微信小程序利用Canvas绘制图片和竖排文字详解
2019/06/25 Javascript
请求时token过期自动刷新token操作
2020/09/11 Javascript
[02:40]2014DOTA2 国际邀请赛中国区预选赛 四大豪门抵达华西村
2014/05/23 DOTA
[06:50]DSPL次级职业联赛十强晋级之路
2014/11/18 DOTA
[08:54]DOTA2-DPC中国联赛 正赛 Aster vs LBZS 选手采访
2021/03/11 DOTA
Python操作使用MySQL数据库的实例代码
2017/05/25 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
2018/12/06 Python
关于Numpy数据类型对象(dtype)使用详解
2019/11/27 Python
英国家喻户晓的家居商店:The Range
2019/03/25 全球购物
专业毕业生个性的自我评价
2013/10/03 职场文书
高三高考决心书
2014/03/11 职场文书
2014年征兵标语
2014/06/20 职场文书
“四风”查摆问题自我剖析材料
2014/09/27 职场文书
领导班子作风建设剖析材料
2014/10/11 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
五年级学生期末评语
2014/12/26 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
2016党校学习心得体会
2016/01/07 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书
sql中mod()函数取余数的用法
2021/05/29 SQL Server
HTML实现仿Windows桌面主题特效的实现
2022/06/28 HTML / CSS
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python