我正在解决附近大学提供的算法书中的问题。以下问题是关于图形算法(Kruskal算法,BFS,DFS,Prim算法)。我已经在这里工作了几天而且我被卡住了。
问题如下:
考虑一下关于二维赛车的电脑游戏。您的汽车是一个像素,并且课程在n×n屏幕上被编码为一组有效像素:您将获得一个2D数组,您可以在其中查找任何像素以查看它是否有效。您的目标是尽可能快地从给定的起始位置到达给定的终点位置。
以下是规则:
- 时间以单位步长计算
- 如上所述,您从一个零速度的起始位置开始
在每个时间步,您都可以修改水平速度 1,或保持不变。对于垂直速度,它也是独立的。因此,如果在特定时间你处于像素(x,y)且已经有速度(vx,vy),那么在下一个时间步骤你将处于位置(x + vx,y + vy),之后如果您愿意,您的速度的每个分量可能会改变±1。
不允许以任意速度射击终点位置。你必须在那里拿起你的奖杯。
在每次踏步时,您的汽车必须处于有效像素,但在步骤之间,您不得驾驶无效像素。为了帮助完成这最后一部分,您将获得一个像素对的表 T ,其中每一对都让您知道从一个像素到另一个像素是否合法。一条直线。因此,在恒定的时间内你可以查看任何一对,看看是否可以直接从一个移动到另一个是好的。
将此游戏制定为图形问题,并描述如何为任何特定赛道找到最佳路线。算法的时间复杂度是多少?
到目前为止我所得到的是将图中的节点表示为速度( n 2 ),并将节点之间的边缘表示为速度的变化。此外,由于存在无效位置,我认为必须有一些方法来加权边缘,以便在它们上运行Kruskal算法。
答案 0 :(得分:0)
我建议将图形定义为未加权图形,并使用以下顶点和边缘定义:
其顶点是表示合法直线行程的有效像素对,如表T中所定义。顶点数因此对应于表T的大小,即 O(n 4 )。顶点也将包括零距离行进,即,像素对是相同像素的重复。
然而,我们可以通过注意在任一方向上存在最大速度来减少顶点的数量,这可以在以0的速度开始时获得并且不会导致网格边界上的车祸。在一个维度中,最大速度只能在一个接一个的步骤中从0变为1,变为2,变为3。由于汽车在一个方向上不能超过 n 像素,并且应该能够及时停止,我们可以发现一个方向上的速度永远不会大于 sqrt(n) )
例如,这种加速然后断开可以给出这些速度的总和:1 + 2 + 3 + 4 + 5 + 4 + 3 + 2 + 1 = 25.如果 n = 25然后汽车将穿过整个网格(在一个维度上),最大速度为5.任何更大的速度都会导致崩溃。
因此,有趣的像素对之间的水平和垂直距离都小于或等于 sqrt(n)。这意味着对于给定像素,最多有 sqrt(n)* sqrt(n),即 n 其他像素以将其组合。由于存在 n 2 像素,我们需要考虑 O(n 3 )对(顶点)。 / p>
其边缘连接可以连续行进的顶点(即像素对)。结果
该图中有两个特殊顶点:
对应于(开始,开始)像素对的那个,因为它代表初始状态(起始像素处的0速度)
对应于(目标,目标)像素对的那个,因为它表示目标状态(目标像素处的速度为0)
然后可以将问题表述为找到这两个顶点之间的最短路径。
unweighted graph is O(E+V)中单一来源最短路径问题的时间复杂度,在此特定问题中 O(9V + V), O(V)< / em>,是 O(n 3 )。此算法是一个BFS,您可以在其中跟踪长度为1的路径,然后将所有这些路径扩展到长度为2(修剪到达已经访问过的顶点的地方),等等,直到您到达目标顶点。您点击它的路径是最短的路径。