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 Django模板的使用方法(图文)
Nov 04 Python
爬山算法简介和Python实现实例
Apr 26 Python
python使用PyGame播放Midi和Mp3文件的方法
Apr 24 Python
python执行子进程实现进程间通信的方法
Jun 02 Python
Python中datetime模块参考手册
Jan 13 Python
Python第三方Window模块文件的几种安装方法
Nov 22 Python
python实现拉普拉斯特征图降维示例
Nov 25 Python
在pytorch中对非叶节点的变量计算梯度实例
Jan 10 Python
jupyter notebook 添加kernel permission denied的操作
Apr 21 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
Jun 23 Python
python 求两个向量的顺时针夹角操作
Mar 04 Python
pandas中DataFrame数据合并连接(merge、join、concat)
May 30 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
海贼王:最美的悬赏令!
2020/03/02 日漫
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
解析如何屏蔽php中的phpinfo()函数
2013/06/06 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
对PHP语言认识上需要避免的10大误区
2014/06/12 PHP
php实现的Curl封装类Curl.class.php用法实例分析
2015/09/25 PHP
PHP实现json_decode不转义中文的方法
2017/05/20 PHP
Javascript里使用Dom操作Xml
2007/01/22 Javascript
细说浏览器特性检测(2)-通用事件检测
2010/11/05 Javascript
字段太多jquey快速清空表单内容方法
2014/08/21 Javascript
javascript中attachEvent用法实例分析
2015/05/14 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
jQuery打字效果实现方法(附demo源码下载)
2015/12/18 Javascript
JS通过Cookie判断页面是否为首次打开
2016/02/05 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
2016/06/13 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
2016/10/11 Javascript
原生JavaScript制作计算器
2016/10/16 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
2016/12/30 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
2017/04/12 Javascript
vue.js模仿京东省市区三级联动的选择组件实例代码
2017/11/22 Javascript
JavaScript实现仿Clock ISO时钟
2018/06/29 Javascript
JS实现鼠标按下拖拽效果
2020/07/23 Javascript
vue 虚拟DOM的原理
2020/10/03 Javascript
python装饰器深入学习
2018/04/06 Python
Python实现的统计文章单词次数功能示例
2019/07/08 Python
Python循环中else,break和continue的用法实例详解
2019/07/11 Python
Python使用Matlab命令过程解析
2020/06/04 Python
Python爬虫之Selenium库的使用方法
2021/01/03 Python
Pandas数据分析的一些常用小技巧
2021/02/07 Python
测量实习生自我鉴定
2013/09/19 职场文书
机电一体化专业推荐信
2013/12/03 职场文书
国贸专业个人求职信范文
2014/01/08 职场文书
2014年母亲节寄语
2014/05/07 职场文书
个人收入证明范本
2014/09/18 职场文书
2014年电话客服工作总结
2014/12/09 职场文书
库房管理员岗位职责
2015/02/12 职场文书