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读取xml实例代码
Jan 28 PHP
判断PHP数组是否为空的代码
Sep 08 PHP
php常用ODBC函数集(详细)
Jun 24 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
Nov 13 PHP
浅谈php扩展imagick
Jun 02 PHP
PHP文件锁函数flock()详细介绍
Nov 18 PHP
Symfony数据校验方法实例分析
Jan 26 PHP
PHP ajax 异步执行不等待执行结果的处理方法
May 27 PHP
php支持中文字符串分割的函数
May 28 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
Apr 22 PHP
PHP调用接口用post方法传送json数据的实例
May 31 PHP
PHP unset函数原理及使用方法解析
Aug 14 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实现小型站点广告管理(修正版)
2006/10/09 PHP
php过滤危险html代码
2008/08/18 PHP
php调用dll的实例操作动画与代码分享
2012/08/14 PHP
PHP图片库imagemagick安装方法
2014/09/23 PHP
Yii框架用户登录session丢失问题解决方法
2017/01/07 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
laravel migrate初学常见错误的解决方法
2017/10/11 PHP
超级退弹代码
2008/07/07 Javascript
javascript call和apply方法
2008/11/24 Javascript
用jQuery简化JavaScript开发分析
2009/02/19 Javascript
jquery实现excel导出的方法
2013/04/04 Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
2014/08/27 Javascript
Jquery异步提交表单代码分享
2015/03/26 Javascript
Javascript闭包(Closure)详解
2015/05/05 Javascript
JS实现可拖曳、可关闭的弹窗效果
2015/09/26 Javascript
原生JS实现导航下拉菜单效果
2020/11/25 Javascript
JavaScript中Object值合并方法详解
2017/12/22 Javascript
JQuery特殊效果和链式调用操作示例
2019/05/13 jQuery
使用vue-cli3 创建vue项目并配置VS Code 自动代码格式化 vue语法高亮问题
2019/05/14 Javascript
laypage.js分页插件使用方法详解
2019/07/27 Javascript
JS检索下拉列表框中被选项目的索引号(selectedIndex)
2019/12/17 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
在Lighttpd服务器中运行Django应用的方法
2015/07/22 Python
Python实现的tcp端口检测操作示例
2018/07/24 Python
Python反射和内置方法重写操作详解
2018/08/27 Python
在Python3 numpy中mean和average的区别详解
2019/08/24 Python
Tensorflow tensor 数学运算和逻辑运算方式
2020/06/30 Python
使用pandas实现筛选出指定列值所对应的行
2020/12/13 Python
印度低票价航空公司:GoAir
2017/10/11 全球购物
仪器仪表检测毕业生自荐信
2013/10/31 职场文书
高等教育专业自荐信范文
2014/03/26 职场文书
齐云山导游词
2015/02/06 职场文书
2015年政教主任工作总结
2015/07/23 职场文书
tensorflow+k-means聚类简单实现猫狗图像分类的方法
2021/04/28 Python
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python