在上面的示例图片中,在任意路径后面有一个绿色圆圈。
我希望红色圆圈尽可能以最小步骤与绿色圆圈相遇,如图所示。
圆圈可以一步移动到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;
}
所以我的问题是:
答案 0 :(得分:0)
我有两种方法可以提高效率
1)从目标开始。 从绿球开始。查找(并跟踪)从绿色位置到红色节点位置的最短路径。这个就自己不会减少搜索但是如果你将搜索的深度限制为移动数字(即移动0搜索到0的深度移动1搜索到1的深度...移动n搜索到n的深度)它会减少你花在搜索上的时间,因为你只会搜索相关的深度,过去那些没有价值且不需要检查的东西。
2)如果你不需要,不要搜索。给你的搜索一个深度,你已经有每个节点的开始和结束的x,y位置,所以在你做A *搜索之前检查移动数和直线距离 例如:0,5(绿色当前位置)和0,0(红色开始位置)之间的最短距离是5,所以如果绿色物体处于移动状态,则移动4或更少,你知道即使它没有办法到达那里没有什么阻碍的方式。但是如果它移动了5个或更多你知道可能有一种方法可以及时到达那个位置,所以值得搜索一下路径实际需要多长时间。