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中文问题解决方法(总结了多位前人经验,初学者必看)
Mar 13 Python
Python写的Socks5协议代理服务器
Aug 06 Python
Python队列的定义与使用方法示例
Jun 24 Python
深入理解Python分布式爬虫原理
Nov 23 Python
深入理解Python3 内置函数大全
Nov 23 Python
基于Django与ajax之间的json传输方法
May 29 Python
Windows下python3.6.4安装教程
Jul 31 Python
Django中的ajax请求
Oct 19 Python
使用Django简单编写一个XSS平台的方法步骤
Mar 25 Python
python 基于TCP协议的套接字编程详解
Jun 29 Python
matplotlib阶梯图的实现(step())
Mar 02 Python
5行Python代码实现一键批量扣图
Jun 29 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脚本的10个技巧(8)
2006/10/09 PHP
探讨PHP使用eAccelerator的API开发详解
2013/06/09 PHP
php递归获取目录内文件(包含子目录)封装类分享
2013/12/25 PHP
PHP实现的博客欢迎提示功能(很特别哦)
2014/06/05 PHP
Smarty环境配置与使用入门教程
2016/05/11 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
jQuery学习2 选择器的使用说明
2010/02/07 Javascript
Javascript将string类型转换int类型
2010/12/09 Javascript
jquery入门—访问DOM对象方法
2013/01/07 Javascript
JQuery中SetTimeOut传参问题探讨
2013/05/10 Javascript
jquery数据验证插件(自制,简单,练手)实例代码
2013/10/24 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
2015/03/03 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
实例详解angularjs和ajax的结合使用
2015/10/22 Javascript
js实现动态加载脚本的方法实例汇总
2015/11/02 Javascript
jquery实现九宫格大转盘抽奖
2015/11/13 Javascript
jquery插件EasyUI中form表单提交实例分享
2016/01/11 Javascript
Backbone.js框架中简单的View视图编写学习笔记
2016/02/14 Javascript
jQuery增加与删除table列的方法
2016/03/01 Javascript
ajax请求data遇到的问题分析
2018/01/18 Javascript
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
微信小程序中this.data与this.setData的区别详解
2018/09/17 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
在Vue中使用antv的示例代码
2020/06/29 Javascript
详解在Python程序中使用Cookie的教程
2015/04/30 Python
Python下载指定页面上图片的方法
2016/05/12 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
2020/03/09 Python
办公室主任职责范文
2013/11/08 职场文书
办公室文员工作自我评价
2013/12/01 职场文书
初二物理教学反思
2014/01/29 职场文书
学生未请假就回家检讨书
2014/09/22 职场文书
2014年质量管理工作总结
2014/12/01 职场文书
2015年高三年级组工作总结
2015/07/21 职场文书
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python