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 相关文章推荐
Tornado服务器中绑定域名、虚拟主机的方法
Aug 22 Python
Python深入学习之闭包
Aug 31 Python
给Python初学者的一些编程技巧
Apr 03 Python
Python全局变量用法实例分析
Jul 19 Python
pip安装时ReadTimeoutError的解决方法
Jun 12 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
Jul 31 Python
python科学计算之scipy——optimize用法
Nov 25 Python
IronPython连接MySQL的方法步骤
Dec 27 Python
Python django框架开发发布会签到系统(web开发)
Feb 12 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
Sep 26 Python
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
Apr 13 Python
Python实现将多张图片合成MP4视频并加入背景音乐
Apr 28 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
Wordpress php 分页代码
2009/10/21 PHP
PHP取得一个类的属性和方法的实现代码
2011/05/22 PHP
Zend Framework入门应用实例详解
2016/12/11 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
javascript脚本调试方法小结
2008/11/24 Javascript
javascript 触发事件列表 比较不错
2009/09/03 Javascript
jquery 模式对话框终极版实现代码
2009/09/28 Javascript
window.event快达到全浏览器支持了,以后使用就方便了
2011/11/30 Javascript
javascript中获取下个月一号,是星期几
2012/06/01 Javascript
javascript实现tabs选项卡切换效果(自写原生js)
2013/03/19 Javascript
ionic js 模型 $ionicModal 可以遮住用户主界面的内容框
2016/06/06 Javascript
js实现楼层效果的简单实例
2016/07/15 Javascript
Bootstrap中datetimepicker使用小结
2016/12/28 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
浅入深出Vue之自动化路由
2019/08/06 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
JS中async/await实现异步调用的方法
2019/08/28 Javascript
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
jquery自定义组件实例详解
2020/12/31 jQuery
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
[04:10]2016国际邀请赛中国区预选赛第二日TOP10精彩集锦
2016/06/28 DOTA
python发送邮件接收邮件示例分享
2014/01/21 Python
Python实现抓取网页并且解析的实例
2014/09/20 Python
学习python类方法与对象方法
2016/03/15 Python
Python使用gensim计算文档相似性
2016/04/10 Python
Python selenium 三种等待方式详解(必会)
2016/09/15 Python
Python简单删除列表中相同元素的方法示例
2017/06/12 Python
itchat接口使用示例
2017/10/23 Python
Python获取CPU、内存使用率以及网络使用状态代码
2018/02/08 Python
美国LOGO设计公司:The Logo Company
2018/07/16 全球购物
Deux par Deux官方网站:设计师童装
2020/01/03 全球购物
绩效专员岗位职责
2013/12/02 职场文书
大学同学会活动方案
2014/08/20 职场文书
小学优秀班主任材料
2014/12/17 职场文书
小学生成绩单评语
2014/12/31 职场文书
Go Plugins插件的实现方式
2021/08/07 Golang