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 21 Python
Python编程中的异常处理教程
Aug 21 Python
Python字符串特性及常用字符串方法的简单笔记
Jan 04 Python
Python自动化测试ConfigParser模块读写配置文件
Aug 15 Python
Python中的函数作用域
May 07 Python
python正向最大匹配分词和逆向最大匹配分词的实例
Nov 14 Python
Python二维码生成识别实例详解
Jul 16 Python
python_mask_array的用法
Feb 18 Python
Python实现Word表格转成Excel表格的示例代码
Apr 16 Python
python 使用elasticsearch 实现翻页的三种方式
Jul 31 Python
Python中生成ndarray实例讲解
Feb 22 Python
上手简单,功能强大的Python爬虫框架——feapder
Apr 27 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/04 星际争霸
一个MYSQL操作类
2006/11/16 PHP
php self,$this,const,static,->的使用
2009/10/22 PHP
PHP迭代器实现斐波纳契数列的函数
2013/11/12 PHP
php实现读取和写入tab分割的文件
2015/06/01 PHP
PHP的全局错误处理详解
2016/04/25 PHP
Yii2中Restful API原理实例分析
2016/07/25 PHP
谈谈php对接芝麻信用踩的坑
2016/12/01 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
实例分析10个PHP常见安全问题
2019/07/09 PHP
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
jQuery实现瀑布流布局
2014/12/12 Javascript
js获取字符串字节数方法小结
2015/06/09 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
javascript实现随机显示星星特效
2016/01/28 Javascript
JS提示:Uncaught SyntaxError:Unexpected token ) 错误的解决方法
2016/08/19 Javascript
微信小程序  自定义创建详细介绍
2016/10/27 Javascript
jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
2016/11/16 Javascript
vue-cli如何引入bootstrap工具的方法
2017/10/19 Javascript
python使用xmlrpc实例讲解
2013/12/17 Python
Python实现简单过滤文本段的方法
2017/05/24 Python
Python读取文件内容的三种常用方式及效率比较
2017/10/07 Python
JS设计模式之责任链模式实例详解
2018/02/03 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
Pandas将列表(List)转换为数据框(Dataframe)
2020/04/24 Python
Python+Kepler.gl实现时间轮播地图过程解析
2020/07/20 Python
Python 实现键盘鼠标按键模拟
2020/11/18 Python
C++和python实现阿姆斯特朗数字查找实例代码
2020/12/07 Python
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
铁路工务反思材料
2014/02/07 职场文书
开业庆典策划方案
2014/02/18 职场文书
玩手机检讨书1000字
2014/10/20 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
python基础学习之递归函数知识总结
2021/05/26 Python
mysql中DCL常用的用户和权限控制
2022/03/31 MySQL