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中工作日类库Busines Holiday的介绍与使用
Jul 06 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
Dec 03 Python
解决python3 Pycharm上连接数据库时报错的问题
Dec 03 Python
pandas删除指定行详解
Apr 04 Python
python将字符串转换成json的方法小结
Jul 09 Python
利用Python进行图像的加法,图像混合(附代码)
Jul 14 Python
解决Django migrate不能发现app.models的表问题
Aug 31 Python
python随机生成库faker库api实例详解
Nov 28 Python
Python拼接字符串的7种方式详解
Mar 19 Python
django model object序列化实例
Mar 13 Python
python 5个实用的技巧
Sep 27 Python
python可视化大屏库big_screen示例详解
Nov 23 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更改目录及子目录下所有的文件后缀的代码
2010/09/24 PHP
php获取textarea的值并处理回车换行的方法
2014/10/20 PHP
php多个文件及图片上传实例详解
2014/11/10 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
详解Laravel视图间共享数据与视图Composer
2016/08/04 PHP
5个最佳的Javascript日期处理类库分享
2012/04/15 Javascript
javascript if条件判断方法小结
2014/05/17 Javascript
JS获取当前日期时间并定时刷新示例
2021/03/04 Javascript
javascript中定义类的方法汇总
2014/12/28 Javascript
Nodejs关于gzip/deflate压缩详解
2015/03/04 NodeJs
javascript中日期函数new Date()的浏览器兼容性问题
2015/09/05 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
2016/10/24 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
10道典型的JavaScript面试题
2017/03/22 Javascript
使用jQuery,Angular实现登录界面验证码详解
2017/04/27 jQuery
jQuery实现对网页节点的增删改查功能示例
2017/09/18 jQuery
使用Electron构建React+Webpack桌面应用的方法
2017/12/15 Javascript
javascript回调函数详解
2018/02/06 Javascript
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
vue中的计算属性和侦听属性
2020/11/06 Javascript
vue+iview实现文件上传
2020/11/17 Vue.js
浅谈Python中的作用域规则和闭包
2018/03/20 Python
Python高级特性切片(Slice)操作详解
2018/09/27 Python
python语言基本语句用法总结
2019/06/11 Python
python制作英语翻译小工具代码实例
2019/09/09 Python
Python Django中的STATIC_URL 设置和使用方式
2020/03/27 Python
Python sql注入 过滤字符串的非法字符实例
2020/04/03 Python
html5使用canvas画空心圆与实心圆
2014/12/15 HTML / CSS
HTML5 3D衣服摇摆动画特效
2016/03/17 HTML / CSS
大学生标准自荐书
2014/06/15 职场文书
学校法制宣传月活动总结
2014/07/03 职场文书
2014办公室年度工作总结
2014/12/09 职场文书
人事局接收函
2015/01/31 职场文书
交通事故协议书范本
2016/03/19 职场文书
2019终止劳动合同协议书最新范本!
2019/07/09 职场文书
《和时间赛跑》读后感3篇
2019/12/16 职场文书