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.MVC的模板标签系统(一)
Sep 05 PHP
ASP和PHP都是可以删除自身的
Apr 09 PHP
20个PHP常用类库小结
Sep 11 PHP
php第一次无法获取cookie问题处理
Dec 15 PHP
php强制用户转向www域名的方法
Jun 19 PHP
一个简单安全的PHP验证码类 附调用方法
Jun 24 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
Jul 03 PHP
PHP基于socket实现客户端和服务端通讯功能
Jul 13 PHP
PHP编程实现脚本异步执行的方法
Aug 09 PHP
PHP常用的类封装小结【4个工具类】
Jun 28 PHP
PhpStorm+xdebug+postman调试技巧分享
Sep 15 PHP
php png失真的原因及解决办法
Oct 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
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
2014/05/06 PHP
既简单又安全的PHP验证码 附调用方法
2016/06/02 PHP
PHP的mysqli_stmt_init()函数讲解
2019/01/24 PHP
Ext.MessageBox工具类简介
2009/12/10 Javascript
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
JS滚轮事件onmousewheel使用介绍
2013/11/01 Javascript
JavaScript实现动态添加,删除行的方法实例详解
2015/07/02 Javascript
JavaScript中this详解
2015/09/01 Javascript
举例说明如何为JavaScript的方法参数设置默认值
2015/11/17 Javascript
理解JS事件循环
2016/01/07 Javascript
jquery实现网页定位导航
2016/08/23 Javascript
jquery-mobile表单的创建方法详解
2016/11/23 Javascript
js仿微信语音播放实现思路
2016/12/12 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
bootstrap table插件的分页与checkbox使用详解
2017/07/23 Javascript
修改npm全局安装模式的路径方法
2018/05/15 Javascript
一个Vue页面的内存泄露分析详解
2018/06/25 Javascript
为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置
2019/09/29 Javascript
js实现从右往左匀速显示图片(无缝轮播)
2020/06/29 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
[01:02:17]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG
2014/05/26 DOTA
Linux CentOS7下安装python3 的方法
2018/01/21 Python
python自动化测试之DDT数据驱动的实现代码
2019/07/23 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
2019/08/06 Python
HTML5实现Notification API桌面通知功能
2016/03/02 HTML / CSS
巴西Mr. Cat在线商店:购买包包和鞋子
2019/09/08 全球购物
党员自我评价分享
2013/12/13 职场文书
策划总监岗位职责
2014/02/16 职场文书
护理专科毕业生自荐书范文
2014/02/19 职场文书
大学运动会入场词
2014/02/22 职场文书
如何写好自荐信
2014/04/07 职场文书
社区五一劳动节活动总结
2015/02/09 职场文书
书法社团活动总结
2015/05/07 职场文书
我的长征观后感
2015/06/09 职场文书
CentOS7环境下MySQL8常用命令小结
2022/06/10 Servers