如果你的迷宫从未改变过,并且任何已存在的路径都会一直存在,那么你不能使用一种映射算法来查找迷宫中的“区域”并将其存储在某种格式中吗?内存使用量将随节点或单元格数量线性增加,而速度则取决于访问和比较数组中两个元素的速度。
[] 标记障碍物):
0 1 2 3 4
+----------+
0 |[][] 2 |
1 | [][] |
2 | [] []|
3 | 1 [] |
4 | [] |
+----------+
索引区域(使用数字哈希而不是“x:y”可能更好):
$regions=array(
'0:1'=>1,'0:2'=>1,'0:3'=>1,'0:4'=>1,'1:2'=>1,'1:3'=>1,'1:4'=>1,
'2:0'=>2,'3:0'=>2,'3:1'=>2,'3:2'=>2,'3:3'=>2,'3:4'=>2,'4:0'=>2,
'4:1'=>2,'4:3'=>2,'4:4'=>2
);
那么你的任务就是找出你的起点和终点是否在同一个区域内:
if ( $regions[$startPoint] == $regions[$endPoint] )
pathExists();
现在如果我没记错的话,A*算法的复杂度(速度)取决于起点和终点之间的距离(或解的长度),这可能用于加快搜索速度。
我会尝试在迷宫中创建一些“交汇节点”(JN)。这些节点可以位于一个函数上(以便快速知道最近的JN在哪里),并且你可以预先计算所有相邻JN之间的路径。
因此,你只需搜索从起点到最近的JN的解决方案,以及从终点到其最近的JN(其中它们都位于同一个区域(上述所说的))。现在我可以想象一种情况(如果函数选择与迷宫的复杂性不符合),即有几个区域,其中一些可能根本没有JN,或者所有的JN都位于迷宫中的障碍物上...因此,如果可能的话,最好手动定义这些JN,或者使这个放置JN的函数非平凡(考虑每个区域的面积)。
一旦到达JN,您可以将它们之间的路径进行索引(以快速检索起点和终点JN之间的预定义路径),或者执行另一个A*路径查找,但这次仅在“交叉节点”集合上进行 - 因为这些节点较少,所以在JN之间进行路径搜索会更快。