本文
介绍了一种基于回溯法的php实现迷宫问题的
方法,供大家
参考:
介绍
最近,我看到leetcode一些算法问题。他们中的一些人看着一些非常简单和非常常见的东西。他们想不出如何
解决它在任何时间,例如,实现sqrt
函数发现阵列排列。如果数学不好,这些看似简单的问题,遇到的第一个要解决的,感觉很难的课程,这是解决迷宫问题的所有解决方案,采用回顾性的方法解决这个问题,不明白的想法,许多更复杂的问题是困难的。
问题描述
这个问题真的是在徘徊的时候遇到的,具体在哪里我不记得了。
一千一百一十一
0101
0101
0111
以上是一个迷宫,左上角是入口,右下角是出口,小可爱(是的,你没看错,是肖明长的草)从入口,逃生出口(1小时不会被人X,1逸说怪物)可以通过,0表示没有过去,只有右下两方向,找出所有可能的逃跑路线,小可爱。
这个问题看起来很简单,你可以看到答案,但是把这个想法
转换成代码,不知道从哪里开始。
如何解决
解决这个问题的一种方法是回溯。首先,看看回溯的定义(百度百科)。
回溯法(探索法和回溯法)是一种最优
搜索方法,也称为探索法,即寻找最优
条件以达到
目标,但当我们探索某一步时,发现原来的选择并不理想或达不到目的。然后我们回到第一步,选择它。回到我们将要返回的技术是不可行的。
我的思维方式:
1。坐标迷宫上方,左上角是(0,0),右下角是(3,3),和其他点分散在坐标
系统。
2。从(0,0)
三.从给定坐标点开始,先搜索右边,1继续,向下搜索0,搜索当前搜索坐标之前搜索。
4。当坐标为(3,3),它是一种回溯点,这个时间也回来了。
5。只要我们不越过边界,重复第三个
步骤。
看看我的PHP实现:
< PHP
$号= {
{ 1,1,1,1,1,1 },
{ 0,1,0,1,0,1 },
{ 0,1,0,1,0,1 },
{ 0,1,1,1,1,1 }
};
功能getret($数据,X,Y元,$结果= {},$记录)
{
快照美元= { };
美元=计数(数据)- 1;
$ YL =计数($数据{ 0 })- 1;
如果(X Y | | > > XL美元美元YL){
没有
空间/跑出去进入迷宫,这样的事情是不会发生的。
返回;
}
如果(数据{ $ x } $ y = } = 0){
向前移动0个/秒,返回前一个状态。
返回;
} elseif($ { $ X } {资料} = = 1 $ Y){
1是这种
情况,在正向搜索中找到了当前
路径的最新坐标。
如果到出口,并记录返回的答案
快照= array_merge美元(美元纪录,{ { $ X,Y元} });
如果(X = = y = =美元美元美元XL YL){
结果{ } = array_merge美元(美元纪录,{ { $ X,Y元} });
返回;
}
{人}
返回;
}
必须进行搜索
这里是$ / /快照
保存当前搜索
位置,等到下一次回到这里将使用
getret($数据,X元,+ + Y元,美元美元的结果,快照);
/向下搜索
getret($数据,+ + $ X,Y美元,导致美元美元,快照);
}
例
$结果{ };
getret($号,0, 0美元,因此,{ });
foreach($结果达POS){
foreach($ POS为XY){
返回({ $ 0 { } },{ $ 1 } })>;
}
结尾;
}
输出结果
(0,0)(0,1)(0,2 = > > > >)(0,3)(0,4)(0,5)(1 = > > > >)(2,5)(3,5)= >结束
(0,0)(0,1)(0,2 = > > > >)(0,3)(1,3)(2,3)(3,3 = > > > >)(3,4)(3,5)= >结束
(0,0)(0,1)(1,1 = > > > >)(2,1)(3,1)(3,2)(3,3 = > > > >)(3,4)(3,5)= >结束
关于PHP相关内容的更多读者感兴趣的读者可以看到特别站:PHP数据结构和算法
教程 希望本文能对PHP
程序设计有所帮助。