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同时支持GIF、png、JPEG
Oct 09 PHP
精美漂亮的php分页类代码
Apr 02 PHP
php引用传值实例详解学习
Nov 06 PHP
php实现监听事件
Nov 06 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
Aug 25 PHP
thinkphp的URL路由规则与配置实例
Nov 26 PHP
Laravel 5框架学习之模型、控制器、视图基础流程
Apr 08 PHP
PHP设计模式之适配器模式代码实例
May 11 PHP
php实现的单一入口应用程序实例分析
Sep 23 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
Jul 07 PHP
PHP parse_ini_file函数的应用与扩展操作示例
Jan 07 PHP
在Laravel5中正确设置文件权限的方法
May 22 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图片验证码制作实现分享(全)
2012/05/10 PHP
php字符串截取的简单方法
2013/07/04 PHP
微信公众平台开发实现2048游戏的方法
2015/04/15 PHP
php实现的简单美国商品税计算函数
2015/07/13 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
JavaScript实现存储HTML字符串示例
2014/04/21 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
JavaScript中length属性的使用方法
2015/06/05 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
2015/06/10 Javascript
Windows 系统下设置Nodejs NPM全局路径
2016/04/26 NodeJs
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
vue-cli创建的项目,配置多页面的实现方法
2018/03/15 Javascript
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
2019/12/13 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
2020/05/22 Javascript
keep-alive保持组件状态的方法
2020/12/02 Javascript
jQuery实现tab栏切换效果
2020/12/22 jQuery
在Pycharm中设置默认自动换行的方法
2019/01/16 Python
python pandas写入excel文件的方法示例
2019/06/25 Python
Django 实现admin后台显示图片缩略图的例子
2019/07/28 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
2019/12/22 Python
详解window.open被浏览器拦截的解决方案
2019/07/18 HTML / CSS
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
试解释COMMIT操作和ROLLBACK操作的语义
2014/07/25 面试题
成教自我鉴定
2013/10/27 职场文书
聊城大学毕业生自荐书
2014/02/01 职场文书
推荐信怎么写
2014/05/09 职场文书
体育课外活动总结
2014/07/08 职场文书
企业安全生产责任书范本
2014/07/28 职场文书
机械工程及其自动化专业求职信
2014/08/08 职场文书
“三支一扶”支教教师思想汇报
2014/09/13 职场文书
软件测试专业推荐信
2014/09/18 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书