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的Tqdm模块的使用
Jan 10 Python
python实现反转部分单向链表
Sep 27 Python
一文带你了解Python中的字符串是什么
Nov 20 Python
用Python编写一个简单的CS架构后门的方法
Nov 20 Python
对Python发送带header的http请求方法详解
Jan 02 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
Nov 19 Python
Django实现图片上传功能步骤解析
Apr 22 Python
在django中form的label和verbose name的区别说明
May 20 Python
利用django创建一个简易的博客网站的示例
Sep 29 Python
运行python提示no module named sklearn的解决方法
Nov 29 Python
Python用摘要算法生成token及检验token的示例代码
Dec 01 Python
python使用yaml 管理selenium元素的示例
Dec 01 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读取ACCESS数据到MYSQL的代码
2011/05/11 PHP
用js实现多域名不同文件的调用方法
2007/01/12 Javascript
js函数般调用正则
2008/04/08 Javascript
jQuery 页面 Mask实现代码
2010/01/09 Javascript
js getBoundingClientRect() 来获取页面元素的位置
2010/11/25 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
jQuery 跨域访问解决原理案例详解
2016/07/09 Javascript
浅析如何利用angular结合translate为项目实现国际化
2016/12/08 Javascript
简单实现bootstrap选项卡效果
2017/02/08 Javascript
js实现功能比较全面的全选和多选
2017/03/02 Javascript
JS实现区分中英文并统计字符个数的方法示例
2018/06/09 Javascript
jquery实现商品sku多属性选择功能(商品详情页)
2019/12/20 jQuery
js校验开始时间和结束时间
2020/05/26 Javascript
[04:16]DOTA2英雄梦之声_第09期_斧王
2014/06/21 DOTA
全面解读Python Web开发框架Django
2014/06/30 Python
Python全局变量用法实例分析
2016/07/19 Python
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
python中装饰器级连的使用方法示例
2017/09/29 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
2019/08/06 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
python连接mysql有哪些方法
2020/06/24 Python
python 图像插值 最近邻、双线性、双三次实例
2020/07/05 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
html5记忆翻牌游戏实现思路及代码
2013/07/25 HTML / CSS
党校培训思想汇报
2014/01/03 职场文书
安卓程序员求职信
2014/02/28 职场文书
一分钟演讲稿
2014/04/30 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
应用外语系自荐信
2014/06/26 职场文书
财务部会计岗位职责
2015/02/03 职场文书
2016年心理学教育培训学习心得体会
2016/01/12 职场文书
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android
浅谈resultMap的用法及关联结果集映射
2021/06/30 Java/Android
python非标准时间的转换
2021/07/25 Python