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的中问验证码
Nov 25 PHP
计算一段日期内的周末天数的php代码(星期六,星期日总和)
Nov 12 PHP
PHP和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
Jul 03 PHP
PHP提示Notice: Undefined variable的解决办法
Nov 24 PHP
解析php DOMElement 操作xml 文档的实现代码
May 10 PHP
解析PHP自带的进位制之间的转换函数
Jun 08 PHP
PHP递归实现层级树状展开
Apr 01 PHP
php htmlentities()函数的定义和用法
May 13 PHP
php 在字符串指定位置插入新字符的简单实现
Jun 28 PHP
thinkphp框架page类与bootstrap分页(美化)
Jun 25 PHP
详解提高使用Java反射的效率方法
Apr 29 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
Nov 23 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关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
简单的自定义php模板引擎
2016/08/26 PHP
php cli模式下获取参数的方法
2017/05/05 PHP
2017年最好用的9个php开发工具推荐(超好用)
2017/10/23 PHP
jQuery 开发者应该注意的9个错误
2012/05/03 Javascript
解决jquery中美元符号命名冲突问题
2014/01/08 Javascript
判断日期是否能跨月查询的js代码
2014/07/25 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
JS中的hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()
2016/08/11 Javascript
ionic实现带字的toggle滑动组件
2016/08/27 Javascript
js生成随机颜色方法代码分享(三种)
2016/12/29 Javascript
从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例
2017/04/13 Javascript
xmlplus组件设计系列之下拉刷新(PullRefresh)(6)
2017/05/03 Javascript
深入理解Vue transition源码分析
2017/07/30 Javascript
JavaScript实现栈结构Stack过程详解
2020/03/07 Javascript
JavaScript实现网页动态生成表格
2020/11/25 Javascript
jquery实现点击左右按钮切换图片
2021/01/27 jQuery
[02:49]2014DOTA2电竞也是体育项目! 势要把荣誉带回中国!
2014/07/20 DOTA
[29:16]完美世界DOTA2联赛决赛日 Inki vs LBZS 第三场 11.08
2020/11/10 DOTA
Python函数式编程指南(四):生成器详解
2015/06/24 Python
python中logging库的使用总结
2017/10/18 Python
wxPython的安装与使用教程
2018/08/31 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
深入浅析Python代码规范性检测
2020/07/31 Python
详解anaconda安装步骤
2020/11/23 Python
OPPO手机官方商城:中国手机市场出货量第一品牌
2017/10/18 全球购物
SHEIN台湾:购买最新流行女装服饰
2019/05/18 全球购物
西班牙在线宠物食品和配件商店:bitiba
2019/10/11 全球购物
大学毕业寄语大全
2014/04/10 职场文书
大学中国梦演讲稿
2014/04/23 职场文书
残疾人小组计划书
2014/04/27 职场文书
环保倡议书50字
2014/05/15 职场文书
批评与自我批评范文
2014/10/15 职场文书
离婚答辩状怎么写
2015/05/22 职场文书
小学生暑假生活总结
2015/07/13 职场文书
2016年离婚协议书范文
2016/03/18 职场文书