本文实例讲述了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实现:

$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实现基于回溯法求解迷宫问题的方法详解相关推荐

  1. php 匿名方法,PHP基于Closure类创建匿名函数的方法详解

    本文实例讲述了PHP基于Closure类创建匿名函数的方法.分享给大家供大家参考,具体如下: Closure 类 用于代表匿名函数的类. 匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象. ...

  2. Java滑动验证_java图片滑动验证(登录验证)原理与实现方法详解

    本文实例讲述了java图片滑动验证(登录验证)原理与实现方法.分享给大家供大家参考,具体如下: 这是我简单做出的效果图,处理300X150px的校验图,并把图片发到前端,用时50毫秒左右,速度还是非常 ...

  3. 【算法分析】实验 4. 回溯法求解0-1背包等问题

    目录 实验内容 实验目的 实验结果 步骤1:描述与分析 步骤2:策略以及数据结构 步骤3 步骤4 步骤5 步骤6 实验总结 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设 ...

  4. java背包算法回溯法_【算法分析】实验 4. 回溯法求解0-1背包等问题

    [TOC] 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设计.算法描述.算法正确性证明.算法分析.算法实现与测试),通过回溯法的在实际问题求解实践中,加深理解其基本原理和 ...

  5. python棋盘放米问题_Python基于回溯法子集树模板解决马踏棋盘问题示例

    本文实例讲述了Python基于回溯法子集树模板解决马踏棋盘问题.分享给大家供大家参考,具体如下: 问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方 ...

  6. python找零钱问题_Python基于回溯法子集树模板解决找零问题示例

    本文实例讲述了Python基于回溯法子集树模板解决找零问题.分享给大家供大家参考,具体如下: 问题 有面额10元.5元.2元.1元的硬币,数量分别为3个.5个.7个.12个.现在需要给顾客找零16元, ...

  7. python回溯方法的模板_Python基于回溯法子集树模板解决0-1背包问题实例

    本文实例讲述了Python基于回溯法子集树模板解决0-1背包问题.分享给大家供大家参考,具体如下: 问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入 ...

  8. python全排列问题_Python基于回溯法子集树模板解决全排列问题示例

    本文实例讲述了Python基于回溯法子集树模板解决全排列问题.分享给大家供大家参考,具体如下: 问题 实现 'a', 'b', 'c', 'd' 四个元素的全排列. 分析 这个问题可以直接套用排列树模 ...

  9. 八皇后问题python回溯_解决Python基于回溯法子集树模板实现8皇后问题

    这篇文章主要介绍了Python基于回溯法子集树模板实现8皇后问题,简单说明了8皇后问题的原理并结合实例形式分析了Python回溯法子集树模板解决8皇后问题的具体实现技巧,需要的朋友可以参考下 本文实例 ...

最新文章

  1. SQL语句中不同的连接JOIN
  2. DL之DNN:利用numpy自定义三层结构+softmax函数建立3层完整神经网络全部代码实现(探究BP神经网络的底层思想)
  3. Linux之文件压缩与打包
  4. python主要应用的几个领域
  5. 一个css文件里实际并不存在的class,不能给element layout产生任何影响
  6. HEXA机器人荣获CES Asia2018 创新奖
  7. 项目NABCD的分析
  8. java hashset char_java集合之HashSet
  9. 6.输入四个数,找出最大值方法二
  10. Python爬虫小白入门(六)爬取披头士乐队历年专辑封面-网易云音乐
  11. python列表方法图解_python中list(列表)的使用方法总结(图文)
  12. oracle参数文件spfile和pfile
  13. 【VS2010安装教程】
  14. Windows All 系统下载
  15. Linux开发板循环显示红绿蓝
  16. 课堂派“互动课件”文件下载
  17. 你是如何转行的?转行容易吗? 1
  18. [轉]现场:是谁在住救灾帐篷者?
  19. ppt文件服务器权限破解,怎么解开PPT文档的权限保护?
  20. 大数据——何谓“大”

热门文章

  1. 如何在Windows CMD的一行中运行两个命令?
  2. JavaScript等同于printf / String.Format
  3. linux的so命令,每天一个 Linux 命令(67): ldd 命令
  4. (转)嵌入式按键驱动,支持短按、长按、双击(中断方式)
  5. node 压缩图片_设计神器!图片在线工具–Online Image Tool
  6. mysql之判断字段是否存在于表中
  7. redis运行redis-server.exe错误
  8. Halcon 抓圆工具spoke
  9. python 使用lxml中的xpath 和 scrpay中的xpath的区别
  10. GoFrame v1.6.0 发布,Go 应用开发框架