加入收藏 | 设为首页 | 会员中心 | 我要投稿 阜阳站长网 (https://www.0558zz.com/)- 科技、建站、内容创作、云计算、网络安全!
当前位置: 首页 > 编程开发 > PHP > 正文

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

发布时间:2020-08-03 17:12:46 所属栏目:PHP 来源:互联网
导读:介绍《PHP应用:PHP实现基于回溯法求解迷宫问题的方法详解》开发教程,希望对您有用。

《PHP应用:PHP实现基于回溯法求解迷宫问题的方法详解》要点:
本文介绍了PHP应用:PHP实现基于回溯法求解迷宫问题的方法详解,希望对您有用。如果有疑问,可以联系我们。

PHP实战本文实例讲述了PHP实现基于回溯法求解迷宫问题的方法.分享给大家供大家参考,具体如下:

PHP实战引言

PHP实战最近在leetcode上看了些算法题,有些看着很简单的很常用的东西,竟然一下子想不出来怎么求解,比如说:实现sqrt函数,求数组的排列.如果高数学的不好,这些看似简单的问题,第一次碰到也会感觉很难求解,当然了,今天要说的是这样一个问题,求解迷宫的所有解,这个问题的求解用到了回溯法的思想,不了解这个思想的话,很多稍微复杂点的问题都很难解了.

PHP实战问题描述

PHP实战这个问题是在实在瞎逛的时候碰到的,具体哪里记不太清了.

PHP实战1 1 1 1
0 1 0 1
0 1 0 1
0 1 1 1

PHP实战上面是一个迷宫,左上角是入口,右下角是出口,小萌(对,你没看错,是长了草的小明)从入口进入,从出口逃出(1个小时逃不出会被X怪物吃掉),其中1表示可以通行,0表示不能通行,只能向右和向下两个方向走,求出所有的小萌可能逃生的路线.

PHP实战这个问题看似挺简单,一下就可以看到答案,但是将思想翻译为代码却不知道从何入手了.

PHP实战如何解决

PHP实战解决这个问题的一种方案就是回溯法,先一起看看回溯法(百度百科)的定义:

PHP实战回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”.

PHP实战我的思路:

PHP实战1. 对上面的迷宫进行坐标化,左上角是(0,0),右下角是(3,3),其他点分散在坐标系中
2. 从(0,0)开始
3. 从给定的坐标点开始,先向右搜索,是1的话继续,是0的话向下搜索,搜索前记录当前已经搜索过的坐标
4. 当坐标等于(3,3)的时候就是一个回溯点了,这个时候也返回
5. 只要不越界,重复第三步骤

PHP实战看看我的PHP实现:

PHP实战
<?php
$nums = [
  [1,1,1],[0,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,$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 "endn";
}

PHP实战输出结果

PHP实战
(0,0)=>(0,1)=>(0,2)=>(0,3)=>(0,4)=>(0,5)=>(1,5)=>(2,5)=>(3,5)=>end
(0,3)=>(1,3)=>(2,3)=>(3,4)=>(3,1)=>(1,1)=>(2,1)=>(3,2)=>(3,5)=>end

PHP实战更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数据结构与算法教程》、《php程序设计算法总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP常用遍历算法与技巧总结》及《PHP数学运算技巧总结》

PHP实战希望本文所述对大家PHP程序设计有所帮助.

(编辑:阜阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读