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 相关文章推荐
用PHP制作静态网站的模板框架(一)
Oct 09 PHP
用php或asp创建网页桌面快捷方式的代码
Mar 23 PHP
php中获取指定IP的物理地址的代码(正则表达式)
Jun 23 PHP
php引用计数器进行垃圾收集机制介绍
Sep 19 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
Jun 27 PHP
php实现通用的从数据库表读取数据到数组的函数实例
Mar 21 PHP
php防止CC攻击代码 php防止网页频繁刷新
Dec 21 PHP
优化WordPress中文章与评论的时间显示
Jan 12 PHP
PHP迭代与递归实现无限级分类
Aug 28 PHP
php中的explode()函数实例介绍
Jan 18 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
Apr 23 PHP
PHP队列场景以及实现代码实例详解
Feb 26 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
解决php中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
php利用反射实现插件机制的方法
2015/03/14 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
可以文本显示的公告栏的js代码
2007/03/11 Javascript
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
JavaScript高级程序设计(第3版)学习笔记5 js语句
2012/10/11 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
jQuery实现模拟marquee标签效果
2015/07/14 Javascript
js电话号码验证方法
2015/09/28 Javascript
javascript bom是什么及bom和dom的区别
2015/11/26 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
2016/07/01 Javascript
JS中parseInt()和map()用法分析
2016/12/16 Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
2017/01/05 Javascript
详解vue中async-await的使用误区
2018/12/05 Javascript
vue自定义指令directive的使用方法
2019/04/07 Javascript
vue组件间的参数传递实例详解
2019/04/26 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
[05:29]2014DOTA2国际邀请赛 赛后专访:LGDNewbee顺利过关
2014/07/13 DOTA
在Django框架中设置语言偏好的教程
2015/07/27 Python
详解用Python处理HTML转义字符的5种方式
2017/12/27 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
2019/01/08 Python
Django 使用easy_thumbnails压缩上传的图片方法
2019/07/26 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
2019/09/24 Python
Python TKinter如何自动关闭主窗口
2020/02/26 Python
Python定时任务APScheduler安装及使用解析
2020/08/07 Python
畜牧兽医本科生个人的自我评价
2013/10/11 职场文书
培训楼经理岗位责任制
2014/02/10 职场文书
环保建议书
2014/03/12 职场文书
2014国庆节商场促销活动策划方案
2014/09/16 职场文书
党的群众路线教育实践活动个人整改措施落实情况
2014/11/04 职场文书
英语教师个人总结
2015/02/09 职场文书
2015年读书月活动总结
2015/03/26 职场文书
团干部培训班心得体会
2016/01/06 职场文书
python机器学习创建基于规则聊天机器人过程示例详解
2021/11/02 Python
如何使用注解方式实现 Redis 分布式锁
2022/07/23 Redis