【发布时间】:2016-06-02 08:44:25
【问题描述】:
解释:
在上面的示例图片中,任意路径后面都有一个绿色圆圈。
我希望红色圆圈以尽可能小的步骤与绿色圆圈相遇,如图所示。
圆圈可以一步移动到 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)。
-
另外,一般来说,在绿色到达网格边界之前,它们有时甚至不是解决方案。
-
我认为这在这个特定的程序中不会有问题,因为他们会轮流迈出一步。
-
好的,在这种情况下略有不同,但仍然很有趣:这意味着有时您的目标是领先绿色一步,然后让它在下一步中抓住您(但无需等待)。请注意,A* 不要求目标是空间中的固定位置,终止可以是任何条件,困难主要在于启发式,我将不得不考虑这一点。切比雪夫距离显然不起作用,也许如果你减半?
标签: language-agnostic shortest-path path-finding