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中uploaded_files函数使用方法详解
Mar 09 PHP
php实现用于验证所有类型的信用卡类
Mar 24 PHP
PHP开启opcache提升代码性能
Apr 26 PHP
双冒号 ::在PHP中的使用情况
Nov 05 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
Jul 07 PHP
PHP获取用户客户端真实IP的解决方案
Oct 10 PHP
基于thinkPHP框架实现留言板的方法
Oct 17 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
Nov 03 PHP
php 可变函数使用小结
Jun 12 PHP
PHP PDOStatement::debugDumpParams讲解
Jan 30 PHP
Laravel框架下载,安装及路由操作图文详解
Dec 04 PHP
php中加密解密DES类的简单使用方法示例
Mar 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
十大催泪虐心动漫,你能坚持看到第几部?
2020/03/04 日漫
深入理解php的MySQL连接类
2013/06/07 PHP
Linux Apache PHP Oracle 安装配置(具体操作步骤)
2013/06/17 PHP
php中分页及SqlHelper类用法实例
2017/01/12 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
laravel 操作数据库常用函数的返回值方法
2019/10/11 PHP
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
jQuery 滑动方法slideDown向下滑动元素
2014/01/16 Javascript
Bootstrap布局之栅格系统详解
2016/06/13 Javascript
AngularJS 过滤器(自带和自建)详解
2016/09/19 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
2017/05/03 Javascript
微信小程序 wx.request方法的异步封装实例详解
2017/05/18 Javascript
Javascript中将变量转换为字符串的三种方法
2017/09/19 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
vue自定义全局共用函数详解
2018/09/18 Javascript
使用layui的router来进行传参的实现方法
2019/09/06 Javascript
基于vue-draggable 实现三级拖动排序效果
2020/01/10 Javascript
[03:23:49]2016.12.17日完美“圣”典全回顾
2016/12/19 DOTA
[01:07:41]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python随机生成彩票号码的方法
2015/03/05 Python
Python端口扫描简单程序
2016/11/10 Python
深入理解python中的atexit模块
2017/03/07 Python
python编写简易聊天室实现局域网内聊天功能
2018/07/28 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
2020/02/07 Python
python matplotlib实现将图例放在图外
2020/04/17 Python
Jar包的作用是什么
2014/03/30 面试题
英语演讲稿范文
2014/01/03 职场文书
大学学习个人的自我评价
2014/02/18 职场文书
优秀教师演讲稿
2014/05/06 职场文书
2015年行政助理工作总结
2015/04/30 职场文书
民间借贷借条范本
2015/05/25 职场文书
运动会入场词
2015/07/18 职场文书
表扬信范文
2019/04/22 职场文书
市场营销计划书
2019/04/24 职场文书
Java 异步任务计算FutureTask
2022/04/28 Java/Android
MySQL数据库之内置函数和自定义函数 function
2022/06/16 MySQL