PHP实现基于回溯法求解迷宫问题的方法详解


Posted in PHP onAugust 17, 2017

本文实例讲述了PHP实现基于回溯法求解迷宫问题的方法。分享给大家供大家参考,具体如下:

引言

最近在leetcode上看了些算法题,有些看着很简单的很常用的东西,竟然一下子想不出来怎么求解,比如说:实现sqrt函数,求数组的排列。如果高数学的不好,这些看似简单的问题,第一次碰到也会感觉很难求解,当然了,今天要说的是这样一个问题,求解迷宫的所有解,这个问题的求解用到了回溯法的思想,不了解这个思想的话,很多稍微复杂点的问题都很难解了。

问题描述

这个问题是在实在瞎逛的时候碰到的,具体哪里记不太清了。

1   1   1   1
0   1   0   1
0   1   0   1
0   1   1   1

上面是一个迷宫,左上角是入口,右下角是出口,小萌(对,你没看错,是长了草的小明)从入口进入,从出口逃出(1个小时逃不出会被X怪物吃掉),其中1表示可以通行,0表示不能通行,只能向右和向下两个方向走,求出所有的小萌可能逃生的路线。

这个问题看似挺简单,一下就可以看到答案,但是将思想翻译为代码却不知道从何入手了。

如何解决

解决这个问题的一种方案就是回溯法,先一起看看回溯法(百度百科)的定义:

回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

我的思路:

1. 对上面的迷宫进行坐标化,左上角是(0,0),右下角是(3,3),其他点分散在坐标系中
2. 从(0,0)开始
3. 从给定的坐标点开始,先向右搜索,是1的话继续,是0的话向下搜索,搜索前记录当前已经搜索过的坐标
4. 当坐标等于(3,3)的时候就是一个回溯点了,这个时候也返回
5. 只要不越界,重复第三步骤

看看我的PHP实现:

<?php
$nums = [
  [1,1,1,1,1,1],
  [0,1,0,1,0,1],
  [0,1,0,1,0,1],
  [0,1,1,1,1,1]
];
function getRet($data, $x, $y, &$result=[], $record)
{
  $snapshort = [];
  $xL = count($data) - 1;
  $yL = count($data[0]) - 1;
  if($x > $xL || $y > $yL) {
    //跑到迷宫不存在的空间了,这种事情绝对不能发生
    return;
  }
  if($data[$x][$y] == "0") {
    //是0的话停止继续前进,退回上一状态
    return;
  } elseif($data[$x][$y] == "1") {
    //是1的话,记录最新的坐标到当前已找到的路径中,继续向前搜索
    //如果到达出口,记录答案并回溯
    $snapshort = array_merge($record, [[$x, $y]]);
    if($x == $xL && $y == $yL) {
      $result[] = array_merge($record, [[$x, $y]]);
      return;
    }
  } else {
    return;
  }
  //向有搜索
  //这里的$snapshort保存当前搜索位置的状态,等到下次回溯到这里的时候会用到
  getRet($data, $x, ++$y, $result, $snapshort);
  //向下搜索
  getRet($data, ++$x, --$y, $result, $snapshort);
}
//看个例子
$result = [];
getRet($nums, 0, 0, $result, []);
foreach ($result as $pos) {
  foreach ($pos as $xy) {
    echo "({$xy[0]},{$xy[1]}) => ";
  }
  echo "end\n";
}

输出结果

(0,0)=>(0,1)=>(0,2)=>(0,3)=>(0,4)=>(0,5)=>(1,5)=>(2,5)=>(3,5)=>end
(0,0)=>(0,1)=>(0,2)=>(0,3)=>(1,3)=>(2,3)=>(3,3)=>(3,4)=>(3,5)=>end
(0,0)=>(0,1)=>(1,1)=>(2,1)=>(3,1)=>(3,2)=>(3,3)=>(3,4)=>(3,5)=>end

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

PHP 相关文章推荐
常用表单验证类,有了这个,一般的验证就都齐了。
Dec 06 PHP
php桌面中心(三) 修改数据库
Mar 11 PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
Aug 07 PHP
关于页面优化和伪静态
Oct 11 PHP
ThinkPHP自动填充实现无限级分类的方法
Aug 22 PHP
Yii框架调试心得--在页面输出执行sql语句
Dec 25 PHP
PHP 500报错的快速解决方法
Dec 14 PHP
PHP实现的简单操作SQLite数据库类与用法示例
Jun 19 PHP
PHP使用PDO调用mssql存储过程的方法示例
Oct 07 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
Nov 17 PHP
PHP检测一个数组有没有定义的方法步骤
Jul 20 PHP
Laravel的加密解密与哈希实例讲解
Mar 24 PHP
PHP基于Closure类创建匿名函数的方法详解
Aug 17 #PHP
PHP编译configure时常见错误的总结
Aug 17 #PHP
基于PHP常用文件函数和目录函数整理
Aug 17 #PHP
PHP实现的堆排序算法详解
Aug 17 #PHP
基于php编程规范(详解)
Aug 17 #PHP
PHP数据库操作四:mongodb用法分析
Aug 16 #PHP
PHP Laravel 上传图片、文件等类封装
Aug 16 #PHP
You might like
搜索和替换文件或目录的一个好类--很实用
2006/10/09 PHP
php中fgetcsv()函数用法实例
2014/11/28 PHP
php上传文件常见问题总结
2015/02/03 PHP
PHP利用imagick生成组合缩略图
2016/02/19 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
2016/09/23 PHP
php提交表单时保留多个空格及换行的文本样式的方法
2017/06/20 PHP
php在linux环境中如何使用redis详解
2020/12/15 PHP
jquery 漂亮的删除确认和提交无刷新删除示例
2013/11/13 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
2013/11/18 Javascript
javascript实现checkBox的全选,反选与赋值
2015/03/12 Javascript
解决前端跨域问题方案汇总
2016/11/20 Javascript
移动端效果之Swiper详解
2017/10/09 Javascript
Angular6新特性之Angular Material
2018/12/28 Javascript
通过js示例讲解时间复杂度与空间复杂度
2019/08/06 Javascript
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
2019/09/21 Javascript
微信小程序转化为uni-app项目的方法示例
2020/05/22 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
[01:12:44]VG vs Mineski Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python使用cookielib库示例分享
2014/03/03 Python
在Python中使用M2Crypto模块实现AES加密的教程
2015/04/08 Python
详解Python中DOM方法的动态性
2015/04/11 Python
浅谈Python中range和xrange的区别
2017/12/20 Python
对python 多个分隔符split 的实例详解
2018/12/20 Python
Python常用爬虫代码总结方便查询
2019/02/25 Python
python add_argument()用法解析
2020/01/29 Python
构造方法和其他方法的区别?怎么调用父类的构造方法
2013/09/22 面试题
公司前台辞职报告
2014/01/19 职场文书
热门专业求职信
2014/05/24 职场文书
承诺书样本
2014/08/30 职场文书
党员教师四风问题整改措施思想汇报
2014/10/08 职场文书
个人工作保证书
2015/02/28 职场文书
2015年南京大屠杀纪念日活动总结
2015/03/24 职场文书
创作书写之导游词实用技巧分享(干货)
2019/12/20 职场文书
pygame面向对象的飞行小鸟实现(Flappy bird)
2021/04/01 Python
python正则表达式re.search()的基本使用教程
2021/05/21 Python