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文本数据库的搜索方法
Oct 09 PHP
通过对服务器端特性的配置加强php的安全
Oct 09 PHP
浅析memcache启动以及telnet命令详解
Jun 28 PHP
php使用curl模拟登录后采集页面的例子
Nov 04 PHP
ThinkPHP入口文件设置及相关注意事项分析
Dec 05 PHP
php计算税后工资的方法
Jul 28 PHP
4种PHP异步执行的常用方式
Dec 24 PHP
详解php魔术方法(Magic methods)的使用方法
Feb 14 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
Apr 15 PHP
php通过smtp邮件验证登陆的方法
May 11 PHP
总结对比php中的多种序列化
Aug 28 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
Dec 04 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/01/09 PHP
Nigma vs Liquid BO3 第一场2.13
2021/03/10 DOTA
js Event对象的5种坐标
2011/09/12 Javascript
JavaScript删除数组元素的方法
2015/03/20 Javascript
Three.js学习之网格
2016/08/10 Javascript
js 获取站点应用名的简单实例
2016/08/18 Javascript
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
Angular实现点击按钮控制隐藏和显示功能示例
2017/12/29 Javascript
最简单的vue消息提示全局组件的方法
2019/06/16 Javascript
5分钟教你用nodeJS手写一个mock数据服务器的方法
2019/09/10 NodeJs
vue cli3 调用百度翻译API翻译页面的实现示例
2019/09/13 Javascript
vue中改变滚动条样式的方法
2020/03/03 Javascript
微信小程序实现底部弹出模态框
2020/11/18 Javascript
[38:21]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS Newbee
2018/03/31 DOTA
Python多线程编程(八):使用Event实现线程间通信
2015/04/05 Python
python编写爬虫小程序
2015/05/14 Python
Python selenium抓取微博内容的示例代码
2018/05/17 Python
python模块smtplib学习
2018/05/22 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
2018/05/22 Python
python实现梯度下降算法
2020/03/24 Python
Python 中导入csv数据的三种方法
2018/11/01 Python
python利用ffmpeg进行录制屏幕的方法
2019/01/10 Python
python实现计算器功能
2019/10/31 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
在python中做正态性检验示例
2019/12/09 Python
Python调用scp向服务器上传文件示例
2019/12/22 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
2020/02/12 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
欧洲第一中国智能手机和平板电脑网上商店:CECT-SHOP
2018/01/08 全球购物
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
无工作经验者个人求职信范文
2013/12/22 职场文书
2014年社区计生工作总结
2014/11/18 职场文书
2014年管理人员工作总结
2014/12/01 职场文书
公务员年度考核评语
2014/12/31 职场文书
酒店前台岗位职责
2015/04/16 职场文书
家长会后的感想
2015/08/11 职场文书