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网络编程学习笔记(四):域名系统
Jun 09 Python
Python中字典的基础知识归纳小结
Aug 19 Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
详解如何使用Python编写vim插件
Nov 28 Python
Python设计模式之观察者模式简单示例
Jan 10 Python
解决安装pycharm后不能执行python脚本的问题
Jan 19 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
Jul 12 Python
Python中的上下文管理器相关知识详解
Sep 19 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
Dec 13 Python
TensorFlow-gpu和opencv安装详细教程
Jun 30 Python
如何将numpy二维数组中的np.nan值替换为指定的值
May 14 Python
Python还能这么玩之用Python做个小游戏的外挂
Jun 04 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
DOTA2 玩家自创拉野攻略 特色英雄快速成长篇
2020/04/20 DOTA
php基础知识:控制结构
2006/12/13 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
2017/07/10 PHP
js实现的网页颜色代码表全集
2007/07/17 Javascript
javascript 表单的友好用户体现
2009/01/07 Javascript
javascript 表格排序和表头浮动效果(扩展SortTable)
2009/04/07 Javascript
javascript 静态对象和构造函数的使用和公私问题
2010/03/02 Javascript
DOM2非标准但却支持很好的几个属性小结
2012/01/21 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
超级简单的jquery操作表格方法
2014/12/15 Javascript
使用jQuery获得内容以及内容的属性
2015/02/26 Javascript
jquery实现倒计时功能
2015/12/28 Javascript
JavaScript实战(原生range和自定义特效)简单实例
2016/08/21 Javascript
javascript鼠标跟随运动3种效果(眼球效果,苹果菜单,方向跟随)
2016/10/27 Javascript
原生JS实现图片网格式渐显、渐隐效果
2017/06/05 Javascript
vue router路由嵌套不显示问题的解决方法
2017/06/17 Javascript
javascript观察者模式实现自动刷新效果
2017/09/05 Javascript
JavaScript数据结构与算法之队列原理与用法实例详解
2017/11/22 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
python matplotlib坐标轴设置的方法
2017/12/05 Python
python实现一个简单的ping工具方法
2019/01/31 Python
解决django后台样式丢失,css资源加载失败的问题
2019/06/11 Python
Python 使用threading+Queue实现线程池示例
2019/12/21 Python
基于Python测试程序是否有错误
2020/05/16 Python
Python datetime模块的使用示例
2021/02/02 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
纯CSS3实现地球自转实现代码(图文教程附送源码)
2012/12/26 HTML / CSS
深入探究HTML5的History API
2015/07/09 HTML / CSS
乌克兰珠宝大卖场:Zlato.ua
2020/09/27 全球购物
经济信息系毕业生自荐信
2014/06/02 职场文书
小学竞选班干部演讲稿
2014/08/20 职场文书
2014国庆节标语口号
2014/09/19 职场文书
长城导游词
2015/01/30 职场文书
golang中的空slice案例
2021/04/27 Golang
Mysql中一千万条数据怎么快速查询
2021/12/06 MySQL
JS前端监控采集用户行为的N种姿势
2022/07/23 Javascript