PHP实现基于回溯法求解迷宫问题的方法详解

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了PHP实现基于回溯法求解迷宫问题的方法详解脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

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

<PRe class="brush:PHp;"> $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,$y]]); return; } } else { return; } //向有搜索 //这里的$snapshort保存当前搜索位置的状态,等到下次回溯到这里的时候会用到 getRet($data,++$y,$result,$snapshort); //向下搜索 getRet($data,++$x,--$y,$snapshort); } //看个例子 $result = []; getRet($nums,[]); foreach ($result as $pos) { foreach ($pos as $xy) { echo "({$xy[0]},{$xy[1]}) => "; } echo "end\n"; }

脚本宝典总结

以上是脚本宝典为你收集整理的PHP实现基于回溯法求解迷宫问题的方法详解全部内容,希望文章能够帮你解决PHP实现基于回溯法求解迷宫问题的方法详解所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。