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之重回函数
Oct 10 Python
讲解Python中运算符使用时的优先级
May 14 Python
深入学习Python中的装饰器使用
Jun 20 Python
Python 爬虫图片简单实现
Jun 01 Python
python先序遍历二叉树问题
Nov 10 Python
python数字图像处理之高级滤波代码详解
Nov 23 Python
Python如何筛选序列中的元素的方法实现
Jul 15 Python
Python字典的概念及常见应用实例详解
Oct 30 Python
解决python脚本中error: unrecognized arguments: True错误
Apr 20 Python
django ORM之values和annotate使用详解
May 19 Python
python中常用的数据结构介绍
Jan 12 Python
如何利用python和DOS获取wifi密码
Mar 31 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+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
In Javascript Class, how to call the prototype method.(three method)
2007/01/09 Javascript
基于JQuery的访问WebService的代码(可访问Java[Xfire])
2010/11/19 Javascript
jQuery实现购物车计算价格功能的方法
2015/03/25 Javascript
javascript数组随机排序实例分析
2015/07/22 Javascript
JavaScript实现定时隐藏与显示图片的方法
2015/08/06 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
2015/11/02 Javascript
AngularJS 输入验证详解及实例代码
2016/07/28 Javascript
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
详解vue-cli3多环境打包配置
2019/03/28 Javascript
js实现简单的无缝轮播效果
2020/09/05 Javascript
ant design vue datepicker日期选择器中文化操作
2020/10/28 Javascript
[02:09]DOTA2辉夜杯 EHOME夺冠举杯现场
2015/12/28 DOTA
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
详解Python3序列赋值、序列解包
2019/05/14 Python
Python实现Word表格转成Excel表格的示例代码
2020/04/16 Python
特步官方商城:Xtep
2017/03/21 全球购物
欧洲最大的球衣网上商店:Kitbag
2017/11/11 全球购物
英国第一独立滑雪板商店:The Snowboard Asylum
2020/01/16 全球购物
C有"按引用传递"吗
2016/09/06 面试题
集团公司总经理岗位职责
2013/12/20 职场文书
即将毕业大学生自荐信
2014/01/24 职场文书
采购类个人求职的自我评价
2014/02/18 职场文书
体育课课后反思
2014/04/24 职场文书
会计求职信范文
2014/05/24 职场文书
公司租房协议书范本
2014/10/08 职场文书
房地产公司财务总监岗位职责
2015/04/03 职场文书
退休教师追悼词
2015/06/23 职场文书
小学语文国培研修日志
2015/11/13 职场文书
教师培训学习心得体会
2016/01/21 职场文书
深度好文:50条没人告诉你的人生经验,句句精辟
2019/08/22 职场文书
Python字典和列表性能之间的比较
2021/06/07 Python
Python Matplotlib库实现画局部图
2021/11/17 Python
CSS SandBox应用场景及常见问题
2022/06/25 HTML / CSS