找到这样的方式,即最大可能的跳跃距离是最小的

问题描述

有一个可以放置在不同高度的平台。例如,这些地图显示了平台的放置方式(在程序中以矩阵NxM,|N|,|M| <= 100

表示)
      _ _ _    
    D _   _ _  
            _ _
              _
    S _ _ _ _ _

在此地图中,space表示space_-平台,S-我们从其出发的平台,D-目的点。在此地图上行走的怪物可以向上,向下向左或向右移动。 怪物从D到达S的可能方法是:

  + + +    
D +   + +  
        + +
          +
S + + + + +

否则它可能会以这种方式到达D

      _ _ _    
    D _   _ _  
    +       _ _
    +         _
    S _ _ _ _ _

因此,到达目的地点的组合可以通过多种方式改变,但要点是,在第一种情况下,怪物做出的跳跃的最大距离1 ,因为以这种方式,两个平台之间的最大距离为1。在第二种情况下,怪物很快到达目的地,但他跳了距离2。怪物的主要目标是到达目的地,而不要跳得太远(越小越好),因此,首选第一种方法。问题是我应该使用哪种算法来找到最大跳跃距离最小的方法?

我考虑过两种方法:

  1. 强力,但是当平台数为=N*M时会很不方便;
  2. 以某种方式将此矩阵转换为图形,其中每个平台均表示为图形的节点,并且通过跳跃距离表示边缘,并找到最小的生成树,但首先我不知道该如何在其中创建相邻矩阵方式,并且将是正确的方式。

解决方法

要解析地图并找到节点:

for i from 1 to N
    for j from 1 to M
        if map(i,j) == 'S' 
            nodes.add(i,j);
            start = nodes.Count;
        elseif map(i,j) == 'D' 
            nodes.add(i,j);
            dest = nodes.Count;
        elseif map(i,j) == '_'
            nodes.add(i,j);
        end
    end
end

在上面的伪代码中,我假设nodes.add(i,j)将带有node.x = 1node.y = j的新节点添加到节点列表中。

然后,构造邻接矩阵:

n = nodes.Count;
adj = n by n matrix,filled with +inf;
for i from 1 to n
    for j from i + 1 to n
       if (nodes[i].x == nodes[j].x) || (nodes[i].y == nodes[j].y)
           adj(i,j) = abs(nodes[i].x - nodes[j].x) +
               abs(nodes[i].y - nodes[j].y);
       end
    end
end

其余为Shortest Path Problem。使用Dijkstra's algorithm查找startdest节点之间的最短路径。

,

感谢您在上面发布内容,我决定完成此想法并获得此代码,对于我得到的测试用例,它可以正常工作。因此,想法是:

  1. 根据给定的平台图,有必要创建一个图,其中一个节点表示一个平台(包括起始平台和目标平台),并且节点之间的边缘表示为它们之间的距离;
  2. 形成图形时,您的目标是找到最小的生成树并找到该树中边缘的最大权重-这就是答案。 代码很大,请在我的github上检查!请注意,1表示平台,2表示启动,3是目的地:

Check this github link out!

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...