如何解决找到这样的方式,即最大可能的跳跃距离是最小的
有一个可以放置在不同高度的平台。例如,这些地图显示了平台的放置方式(在程序中以矩阵NxM,|N|,|M| <= 100
_ _ _
D _ _ _
_ _
_
S _ _ _ _ _
在此地图中,space
表示space
,_
-平台,S
-我们从其出发的平台,D
-目的点。在此地图上行走的怪物可以向上,向下或向左或向右移动。
怪物从D
到达S
的可能方法是:
+ + +
D + + +
+ +
+
S + + + + +
否则它可能会以这种方式到达D
:
_ _ _
D _ _ _
+ _ _
+ _
S _ _ _ _ _
因此,到达目的地点的组合可以通过多种方式改变,但要点是,在第一种情况下,怪物做出的跳跃的最大距离为1
,因为以这种方式,两个平台之间的最大距离为1
。在第二种情况下,怪物很快到达目的地,但他跳了距离2
。怪物的主要目标是到达目的地,而不要跳得太远(越小越好),因此,首选第一种方法。问题是我应该使用哪种算法来找到最大跳跃距离最小的方法?
我考虑过两种方法:
- 强力,但是当平台数为
=N*M
时会很不方便; - 以某种方式将此矩阵转换为图形,其中每个平台均表示为图形的节点,并且通过跳跃距离表示边缘,并找到最小的生成树,但首先我不知道该如何在其中创建相邻矩阵方式,并且将是正确的方式。
解决方法
要解析地图并找到节点:
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 = 1
和node.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查找start
和dest
节点之间的最短路径。
感谢您在上面发布内容,我决定完成此想法并获得此代码,对于我得到的测试用例,它可以正常工作。因此,想法是:
- 根据给定的平台图,有必要创建一个图,其中一个节点表示一个平台(包括起始平台和目标平台),并且节点之间的边缘表示为它们之间的距离;
- 形成图形时,您的目标是找到最小的生成树并找到该树中边缘的最大权重-这就是答案。
代码很大,请在我的github上检查!请注意,
1
表示平台,2
表示启动,3
是目的地:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。