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中合并两个文本文件并按照姓名首字母排序的例子
Apr 25 Python
python实现分页效果
Oct 25 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
Nov 23 Python
动态规划之矩阵连乘问题Python实现方法
Nov 27 Python
Python异常对代码运行性能的影响实例解析
Feb 08 Python
python使用xlsxwriter实现有向无环图到Excel的转换
Dec 12 Python
对Pyhon实现静态变量全局变量的方法详解
Jan 11 Python
创建Django项目图文实例详解
Jun 06 Python
python中如何写类
Jun 29 Python
python如何安装下载后的模块
Jul 03 Python
Python模块常用四种安装方式
Oct 20 Python
基于PyInstaller各参数的含义说明
Mar 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
基于php iconv函数的使用详解
2013/06/09 PHP
PHP二维数组排序简单实现方法
2016/02/14 PHP
PHP简单获取及判断提交来源的方法
2016/04/22 PHP
PHP解决中文乱码
2017/04/28 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
javascript 星级评分效果(手写)
2012/12/24 Javascript
jquery 无限级联菜单案例分享
2013/03/26 Javascript
window.onresize 多次触发的解决方法
2013/11/08 Javascript
极易被忽视的javascript面试题七问七答
2016/02/15 Javascript
JavaScript基于自定义函数判断变量类型的实现方法
2016/11/23 Javascript
vue2.0之多页面的开发的示例
2018/01/30 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
Angular使用操作事件指令ng-click传多个参数示例
2018/03/27 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
JS实现计算小于非负数n的素数的数量算法示例
2019/02/26 Javascript
layui点击弹框页面 表单请求的方法
2019/09/21 Javascript
vuex页面刷新导致数据丢失的解决方案
2020/12/10 Vue.js
python list中append()与extend()用法分享
2013/03/24 Python
Python标准库os.path包、glob包使用实例
2014/11/25 Python
Python爬虫包BeautifulSoup简介与安装(一)
2018/06/17 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
2018/06/26 Python
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
matplotlib实现热成像图colorbar和极坐标图的方法
2018/12/13 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
python画双y轴图像的示例代码
2019/07/07 Python
Django 项目通过加载不同env文件来区分不同环境
2020/02/17 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
2020/04/01 Python
加拿大床上用品、家居装饰、厨房和浴室产品购物网站:Linen Chest
2018/06/05 全球购物
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
药品质量检测应届生求职信
2013/11/14 职场文书
软件工程师岗位职责
2013/11/16 职场文书
协议书格式
2014/04/23 职场文书
2014年党务公开工作总结
2014/12/09 职场文书
2015年幼儿教师个人工作总结
2015/05/20 职场文书
教师培训简讯
2015/07/20 职场文书