两条路径的最短交点

Shortest meeting point of two paths

解释:

在上面的示例图片中,有一个绿色圆圈跟随任意路径。

我希望红色圆圈以尽可能少的步骤与绿色圆圈相交,如图所示。

圆圈可以一步移动到8个相邻格子中的任何一个,黑色格子不能穿过。

路径表示为坐标列表。在这种情况下,绿色路径 是 [(0,3),(0,2),(0,1)...(5,0)].

为了找到最短的交汇点,我可以遍历绿色路径列表中的每个坐标,并使用 A* 算法找到从红色圆圈到该坐标的最短路径。如果返回的路径长度等于绿色圆圈到达该坐标所需的步数,则找到最短的会合点路径。

这当然是一种蛮力方法,java 代码看起来像这样:

List<Coord> minMeetingPointPath(Coord redLoc, List<Coord> greenPath) {
    for (int step = 0; step < greenPath.size(); step++) {
        Coord greenLoc = greenPath.get(step);
        List<Coord> redPath = shortestPathAStar(redLoc, greenLoc);
        if (redPath.size() == step)
            return redPath;
    }
    return null;
}

问题

所以我的问题是:

  1. 是否有更有效的方法来解决这个问题而不使用蛮力方法?

我有 2 种方法可以提高效率

1) 从目标开始。 从绿球开始。查找(并跟踪)从绿色节点位置到红色节点位置的最短路径。这本身不会减少搜索,但是如果您将搜索深度限制为移动数(即移动 0 搜索到深度 0 移动 1 搜索到深度 1 ... 移动 n 搜索到深度 n ) 它会减少你搜索的时间,因为你只会搜索到相关的深度,超过那个点的任何东西都没有价值,不需要检查。

2) 如果不需要,根本不要搜索。给你的搜索一个深度降神会,你已经有了每个节点的开始和结束的 x,y 位置,所以在你做你的 A* 搜索之前检查移动数和直线距离 例如:0,5(绿色当前位置)和 0,0(红色起始位置)之间的最短距离是 5 所以如果绿色物体移动是移动 4 或更少,你知道没有办法到达那里,即使没有什么挡路的。但是,如果它移动了 5 步或更多,您知道可能有一种方法可以及时到达该位置,因此值得搜索以查看路径实际需要多长时间。