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 相关文章推荐
第十三节--对象串行化
Nov 16 PHP
php 移除数组重复元素的一点说明
Nov 27 PHP
屏蔽机器人从你的网站搜取email地址的php代码
Nov 14 PHP
ThinkPHP3.1新特性之查询条件预处理简介
Jun 19 PHP
php提交过来的数据生成为txt文件
Apr 28 PHP
php自动提交表单的方法(基于fsockopen与curl)
May 09 PHP
Yii视图CGridView实现操作按钮定义地址示例
Jul 14 PHP
PHP数组相加操作及与array_merge的区别浅析
Nov 26 PHP
php实现用户登陆简单实例
Apr 04 PHP
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
Jun 09 PHP
PHP实现函数内修改外部变量值的方法示例
Dec 28 PHP
php中isset与empty函数的困惑与用法分析
Jul 05 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
如何用phpmyadmin设置mysql数据库用户的权限
2012/01/09 PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
php常用Output和ptions/Info函数集介绍
2013/06/19 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
jQuery EasyUI中对表格进行编辑的实现代码
2010/06/10 Javascript
jQuery用unbind方法去掉hover事件及其他方法介绍
2013/03/18 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
javascript实现锁定网页、密码解锁效果(类似系统屏幕保护效果)
2014/08/15 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
jquery通过load获取文件的内容并跳到锚点的方法
2015/01/29 Javascript
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
angularjs创建弹出框实现拖动效果
2020/08/25 Javascript
js实现简易聊天对话框
2017/08/17 Javascript
checkbox:click事件触发span元素内容改变的方法
2017/09/11 Javascript
vue2实现搜索结果中的搜索关键字高亮的代码
2018/08/29 Javascript
Vue实战教程之仿肯德基宅急送App
2019/07/19 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
[01:12:08]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.24
2019/09/10 DOTA
windows下pycharm安装、创建文件、配置默认模板
2018/07/31 Python
django 信号调度机制详解
2019/07/19 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
2020/12/10 Python
Html5原创俄罗斯方块(基于canvas)
2019/01/07 HTML / CSS
Ralph Lauren英国官方网站:Ralph Lauren UK
2018/04/03 全球购物
法雷奥SQA(electric)面试问题
2016/01/23 面试题
简历的自我评价范文
2014/02/04 职场文书
联欢晚会主持词
2014/03/25 职场文书
与美同行演讲稿
2014/09/13 职场文书
在教室放鞭炮的检讨书
2014/09/28 职场文书
表扬稿格式范文
2015/01/16 职场文书
民间借贷借条如何写
2015/05/26 职场文书
红色影片观后感
2015/06/18 职场文书
服装店员工管理制度
2015/08/07 职场文书
党员心得体会范文2016
2016/01/23 职场文书
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB