赛车通过网格算法拼图

时间:2017-11-30 20:31:29

标签: algorithm graph puzzle

我正在解决附近大学提供的算法书中的问题。以下问题是关于图形算法(Kruskal算法,BFS,DFS,Prim算法)。我已经在这里工作了几天而且我被卡住了。

问题如下:

  

考虑一下关于二维赛车的电脑游戏。您的汽车是一个像素,并且课程在n×n屏幕上被编码为一组有效像素:您将获得一个2D数组,您可以在其中查找任何像素以查看它是否有效。您的目标是尽可能快地从给定的起始位置到达给定的终点位置。

     

以下是规则:

     
      
  • 时间以单位步长计算
  •   
  • 如上所述,您从一个零速度的起始位置开始
  •   
  • 在每个时间步,您都可以修改水平速度   1,或保持不变。对于垂直速度,它也是独立的。因此,如果在特定时间你处于像素(x,y)且已经有速度(vx,vy),那么在下一个时间步骤你将处于位置(x + vx,y + vy),之后如果您愿意,您的速度的每个分量可能会改变±1。

  •   
  • 不允许以任意速度射击终点位置。你必须在那里拿起你的奖杯。

  •   
  • 在每次踏步时,您的汽车必须处于有效像素,但在步骤之间,您不得驾驶无效像素。为了帮助完成这最后一部分,您将获得一个像素对的表 T ,其中每一对都让您知道从一个像素到另一个像素是否合法。一条直线。因此,在恒定的时间内你可以查看任何一对,看看是否可以直接从一个移动到另一个是好的。

  •   
     

将此游戏制定为图形问题,并描述如何为任何特定赛道找到最佳路线。算法的时间复杂度是多少?

到目前为止我所得到的是将图中的节点表示为速度( n 2 ),并将节点之间的边缘表示为速度的变化。此外,由于存在无效位置,我认为必须有一些方法来加权边缘,以便在它们上运行Kruskal算法。

1 个答案:

答案 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>

  • 其边缘连接可以连续行进的顶点(即像素对)。结果

    • 两个连接的顶点表示两个像素对,它们具有(至少)一个共同的像素,即第一个旅行单元结束而第二个旅行单元开始的像素;
    • 这些顶点最多有9个邻居,因为在驱动期间x速度可以改变-1,0或+1(3个选项),同样适用于y速度,提供9种可能性。

该图中有两个特殊顶点:

  • 对应于(开始,开始)像素对的那个,因为它代表初始状态(起始像素处的0速度)

  • 对应于(目标,目标)像素对的那个,因为它表示目标状态(目标像素处的速度为0)

然后可以将问题表述为找到这两个顶点之间的最短路径。

unweighted graph is O(E+V)中单一来源最短路径问题的时间复杂度,在此特定问题中 O(9V + V) O(V)< / em>,是 O(n 3 。此算法是一个BFS,您可以在其中跟踪长度为1的路径,然后将所有这些路径扩展到长度为2(修剪到达已经访问过的顶点的地方),等等,直到您到达目标顶点。您点击它的路径是最短的路径。