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的加密方式及原理
Jun 14 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
Sep 25 PHP
解析php中array_merge与array+array的区别
Jun 21 PHP
使用PHP获取汉字的拼音(全部与首字母)
Jun 27 PHP
深入解析php中的foreach函数
Aug 31 PHP
对PHP新手的一些建议(PHP学习经验总结)
Aug 20 PHP
WordPress中&quot;无法将上传的文件移动至&quot;错误的解决方法
Jul 01 PHP
php实现短信发送代码
Jul 05 PHP
php微信公众平台示例代码分析(二)
Dec 06 PHP
php实现基于pdo的事务处理方法示例
Jul 21 PHP
阿里云Win2016安装Apache和PHP环境图文教程
Mar 11 PHP
php-fpm.conf配置文件中文说明详解及重要参数说明
Oct 10 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/04/27 PHP
PHP项目多语言配置平台实现过程解析
2020/05/18 PHP
angularJS 中input示例分享
2015/02/09 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
13个PHP函数超实用
2015/10/21 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
2015/12/04 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
2016/12/18 Javascript
javascript事件的绑定基础实例讲解(34)
2017/02/14 Javascript
jQuery扩展_动力节点Java学院整理
2017/07/05 jQuery
jQuery实现弹窗下底部页面禁止滑动效果
2017/12/19 jQuery
详解如何用babel转换es6的class语法
2018/04/03 Javascript
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
2018/08/22 Javascript
Three.js实现3D机房效果
2018/12/30 Javascript
vue项目中引入vue-datepicker插件的详解
2019/05/14 Javascript
vue实现手机端省市区区域选择
2019/09/27 Javascript
electron+vue实现div contenteditable截图功能
2020/01/07 Javascript
Python中多线程thread与threading的实现方法
2014/08/18 Python
利用Python爬虫给孩子起个好名字
2017/02/14 Python
python分布式环境下的限流器的示例
2017/10/26 Python
用python一行代码得到数组中某个元素的个数方法
2019/01/28 Python
详解Python:面向对象编程
2019/04/10 Python
Python入门Anaconda和Pycharm的安装和配置详解
2019/07/16 Python
Pandas中DataFrame的分组/分割/合并的实现
2019/07/16 Python
详解Django模版中加载静态文件配置方法
2019/07/21 Python
opencv导入头文件时报错#include的解决方法
2019/07/31 Python
Python安装whl文件过程图解
2020/02/18 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
使用python编写一个语音朗读闹钟功能的示例代码
2020/07/14 Python
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
html5关于外链嵌入页面通信问题(postMessage解决跨域通信)
2020/07/20 HTML / CSS
SheIn俄罗斯:时尚女装网上商店
2017/02/28 全球购物
初中学习计划书范文
2014/09/15 职场文书
大学辅导员述职报告
2015/01/10 职场文书
企业爱心捐款倡议书
2015/04/27 职场文书
职场:企业印章管理制度(模板)
2019/10/18 职场文书
三十年再续同学情倡议书
2019/11/27 职场文书