[英]Implementation of recursive algorithm
我有两种物体, Ball
和Platform
。 球具有(x,y)
坐标,平台具有(x_begin, x_end, y)
。 最多可以有80个平台。
我被要求找到任何给定Ball
到地面的最短路径( y=0
)。 请注意,此输出应仅为最小距离。
考虑到我认为最好使用蛮力的限制:计算到地面的所有可能距离,然后返回最小值。
我以为我会做的是写一个递归函数:首先计算到最近平台的垂直距离,然后再分支到左右两侧。 破坏条件是所有路径到达地面时。
void calculateDistances(Ball b, vector<Platform> ps, vector<float>* distances)
{
//The idea is to have, for every branch
// distances[i] = vertical distance
// distances[i+1] = distance to right
// distances[i+2] = distance to left
Platform* p = NULL;
float d_y = verticalDistanceToNearestPlatform(ps, p); // "p" now holds the platform the ball is on
if (d_y == 0)
return; //already on floor
distances->push_back(d_y);
d_x_right = distanceToRightEdgeOfPlatform(p);
distances->push_back(d_x_right);
d_x_left = distanceToLeftEdgeOfPlatform(p);
distances->push_back(d_x_left);
}
这里的问题很明显......我在地球上如何使这个递归?
非常感谢!
PS:这个问题意味着在大约两个半小时内解决。
递归解决方案(例如, horizontalDistanceToGround(x, y)
)将涉及计算从某个任意点(x, y)
到地面上最近点的水平距离,如下所示:
(x, y)
和地面之间没有平台,则返回0。 (x, y)
和地面之间有任何平台,那么找到最近的平台(即最大platform_y
_y小于y
)。 如果该平台位于(platform_min_x, platform_max_x, platform_y)
,则返回(x - platform_min_x) + horizontalDistanceToGround(platform_min_x, platform_y)
和(platform_max_x - x) + horizontalDistanceToGround(platform_max_x, platform_y)
的最小值。 这基本上计算了从当前x位置到平台末端以及从那里到地面所需的最小距离。 我会留下找到(x, y)
和地面(如果有的话(x, y)
之间最近的平台来弄清楚。
从球到地的最短距离是distanceToGround(ball_x, ball_y) + ball_y
。
注意:根据@ MooingDuck关于垂直距离与递归无关的有用注释更新。
您可以将此问题转换为图形问题,然后使用任意数量的图形搜索算法来解决它。
为此,循环遍历所有平台并为其每个边以及直接位于另一个平台边缘下方的任何点创建节点。 将共享共同平台的所有节点连接在一起。 也可以进行垂直连接。
对地面执行相同的操作,但不要为边缘添加其他节点,也不要连接地面节点
现在,您可以使用Dijkstra算法(重建变体)来搜索图形,以查找顶部和底部每个点之间的最短路径。 选择具有最低值的结果,您就完成了。 Dijkstra算法在O(N ^ 2)中运行,其中N是节点,用于天真实现,O(E + N log N),其中E是智能实现的边缘。
您也可以使用A *,这可能更容易实现。
寻找一个球从边缘掉下来的平台很容易。 把地面当作一个平台。 按高度对平台进行排序。 对于每个平台,线性地穿过它下面的所有平台,从最近的平台开始。 查看较高平台的x值是否落在下平台边缘定义的范围内。 这需要O(P ^ 2)。 (P是平台数量。)
这可能不会直接回答你的问题(也就是说这不是蛮力),但我认为这是一个更好的方向指向你。另外,如果你试图强行所有的方向,球可以去,它最终是像O这样的东西(2 ^ P),这是一个令人不快的高时间复杂性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.