Python基于递归算法实现的走迷宫问题


Posted in Python onAugust 04, 2017

本文实例讲述了Python基于递归算法实现的走迷宫问题。分享给大家供大家参考,具体如下:

什么是递归?

简单地理解就是函数调用自身的过程就称之为递归

什么时候用到递归?

如果一个问题可以表示为更小规模的迭代运算,就可以使用递归算法。
迷宫问题:一个由0或1构成的二维数组中,假设1是可以移动到的点,0是不能移动到的点,如何从数组中间一个值为1的点出发,每一只能朝上下左右四个方向移动一个单位,当移动到二维数组的边缘,即可得到问题的解,类似的问题都可以称为迷宫问题。

在python中可以使用list嵌套表示二维数组。假设一个6*6的迷宫,问题时从该数组坐标[3][3]出发,判断能不能成功的走出迷宫。

maze=[[1,0,0,1,0,1],
   [1,1,1,0,1,0],
   [0,0,1,0,1,0],
   [0,1,1,1,0,0],
   [0,0,0,1,0,0],
   [1,0,0,0,0,0]]

针对这个迷宫问题,我们可以使用递归的思想很好的解决。对于数组中的一个点,该点的四个方向可以通过横纵坐标的加减轻松的表示,每当移动的一个可移动的点时候,整个问题又变为和初始状态一样的问题,继续搜索四个方向找可以移动的点,知道移动到数组的边缘。

所以我们可以这样编码:

# 判断坐标的有效性,如果超出数组边界或是不满足值为1的条件,说明该点无效返回False,否则返回True。
def valid(maze,x,y):
  if (x>=0 and x<len(maze) and y>=0 and y<len(maze[0]) and maze[x][y]==1):
    return True
  else:
    return False
# 移步函数实现
def walk(maze,x,y):
  # 如果位置是迷宫的出口,说明成功走出迷宫
  if(x==0 and y==0):
    print("successful!")
    return True
  # 递归主体实现
  if valid(maze,x,y):
    # print(x,y)
    maze[x][y]=2 # 做标记,防止折回
    # 针对四个方向依次试探,如果失败,撤销一步
    if not walk(maze,x-1,y):
      maze[x][y]=1
    elif not walk(maze,x,y-1):
      maze[x][y]=1
    elif not walk(maze,x+1,y):
      maze[x][y]=1
    elif not walk(maze,x,y+1):
      maze[x][y]=1
    else:
      return False # 无路可走说明,没有解 
  return True
walk(maze,3,3)

递归是个好东西呀!

PS:本站还有一个无限迷宫游戏,基于JS实现,提供给大家参考一下:

在线迷宫小游戏:
http://tools.3water.com/games/migong

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python提取内容关键词的方法
Mar 16 Python
Python中的字典与成员运算符初步探究
Oct 13 Python
python dict.get()和dict['key']的区别详解
Jun 30 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
Feb 18 Python
浅析python中numpy包中的argsort函数的使用
Aug 30 Python
python读取并写入mat文件的方法
Jul 12 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
Jul 22 Python
python基于opencv检测程序运行效率
Dec 28 Python
python openCV实现摄像头获取人脸图片
Aug 20 Python
python 代码运行时间获取方式详解
Sep 18 Python
简单且有用的Python数据分析和机器学习代码
Jul 02 Python
python中validators库的使用方法详解
Sep 23 Python
Python实现的科学计算器功能示例
Aug 04 #Python
Python中用字符串调用函数或方法示例代码
Aug 04 #Python
Python编程实现的图片识别功能示例
Aug 03 #Python
详解python实现读取邮件数据并下载附件的实例
Aug 03 #Python
详解 Python中LEGB和闭包及装饰器
Aug 03 #Python
Python 爬虫之超链接 url中含有中文出错及解决办法
Aug 03 #Python
python中MethodType方法介绍与使用示例
Aug 03 #Python
You might like
php 文件上传类代码
2011/08/06 PHP
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
php图片缩放实现方法
2014/02/20 PHP
PHP检测移动设备类mobile detection使用实例
2014/04/14 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
2015/12/07 PHP
php如何利用pecl安装mongodb扩展详解
2019/01/09 PHP
jQuery点击后一组图片左右滑动的实现代码
2012/08/16 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
jQuery的one()方法用法实例
2015/01/19 Javascript
在JavaScript中用getMinutes()方法返回指定的分时刻
2015/06/10 Javascript
javascript电商网站抢购倒计时效果实现
2015/11/19 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
2017/01/19 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
2017/04/13 jQuery
JS实现的简单四则运算计算器功能示例
2017/09/27 Javascript
VUE饿了么树形控件添加增删改功能的示例代码
2017/10/17 Javascript
微信小程序使用image组件显示图片的方法【附源码下载】
2017/12/08 Javascript
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
自定义Vue组件打包、发布到npm及使用教程
2019/05/22 Javascript
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
python中实现定制类的特殊方法总结
2014/09/28 Python
python机器学习之决策树分类详解
2017/12/20 Python
python实现装饰器、描述符
2018/02/28 Python
Python之inspect模块实现获取加载模块路径的方法
2018/10/16 Python
基于python指定包的安装路径方法
2018/10/27 Python
python生成lmdb格式的文件实例
2018/11/08 Python
html5的新玩法——语音搜索
2013/01/03 HTML / CSS
物流管理专业毕业生求职信
2014/03/23 职场文书
高中学生会竞选演讲稿
2014/08/25 职场文书
信用卡结清证明怎么写
2014/09/13 职场文书
群众路线班子对照检查材料
2014/09/25 职场文书
带香烟到学校抽的检讨书
2014/09/25 职场文书
工作汇报开头与结尾怎么写
2014/11/08 职场文书
单位计划生育责任书
2015/05/09 职场文书
2016教师读书思廉心得体会
2016/01/23 职场文书
铁拳制作人赞《铁拳7》老头环Mod:制作精良 但别弄了
2022/04/03 其他游戏