检查十六进制是否在带有加权十六进制的六角形平铺范围内

时间:2018-12-22 23:02:31

标签: algorithm lua

问题

假设我有一个(无限)六角形平铺。从1个六边形开始,除了一些“空心”六边形,我可以移动到每个相邻的六边形。一些六角形的权重为1,另一些六角形的权重为2。最大权重为x的情况下,如何从x以下的起始十六进制中获取具有累积权重的所有六角形?

上下文

我正在尝试为《文明5》游戏制作模组。在其中,我需要获得一个单位可以在10圈内进入的所有瓦片的集合,知道这个单位每圈有1个移动点,并且除道路以外的每块瓷砖要花费1 MP(道路成本0.5)。山地和海事瓷砖无法访问。 简而言之,它是所选单位周围显示区域的扩展版本,显示了在单位1圈距离内的所有图块。

当前测试

到目前为止,我已经尝试了2种解决方案,但是似乎没有一个非常有效。我的大多数尝试都无法得知要检查的图块(因为尚未检查它们,或者因为尚未检查最短路径,因为它们尚未被检查),最后一次检查了范围内的每个图块,并且拒绝看似在范围内但已从比所需的更长的路径检查的几块瓷砖,以为它们太远了。

  • 第一个非常幼稚,并且对每个磁贴进行递归检查 围绕起始图块,消除所有具有累积值的图块 重量超过x
  • 对于第二个解决方案,我保持不变 结构,但我添加了一个条件过滤条件,即图块不应 如果距原点的距离小于累计距离,则将被拒绝 计算去那里的权重(因为多条路径的累计值不同 权重可以导致相同的图块)。但是在很多情况下 断言是错误的。

在执行此操作时,我真的需要一些建议。

谢谢你, 梅塔

2 个答案:

答案 0 :(得分:1)

您应该使用Dijkstra的算法来找到通往附近瓷砖的最短路径。由于Dijkstra的算法会按照长度增加的顺序找到最短路径,因此,当找到比x长的最短路径时,您就可以停下来。

请参见https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

答案 1 :(得分:0)

这里不需要Dijkstra。
简单的“波动”算法就足够了。

您需要一个数组dist来存储场中每个六边形的数字(距离)。
您还需要另一个数组wave来存储最近刷新的六边形列表。

伪代码:

variable x = 10 -- distance in MP
loop for each hexagon on the field
    dist[hexagon] = +infinity
end-loop
dist[unit_hexagon] = 0
wave = empty array
append unit_hexagon to array wave
loop while array wave is not empty
    create new empty array new_wave
    loop for each hexagon in array wave
        loop for each of 6 adjacent hexagons of hexagon
            if adjacent_hexagon is accessible (not a mountain)
                variable adj_dist = dist[hexagon] + price(adjacent_hexagon)
                -- where price = 0.5 for roads, 1 for other cells
                if (adj_dist < dist[adjacent_hexagon]) and (adj_dist < x) then
                    dist[adjacent_hexagon] = adj_dist
                    append adjacent_hexagon to array new_wave
                end-if
            end-if
        end-loop
    end-loop
    wave = empty array
    copy everything from array new_wave to array wave
end-loop
loop for each hexagon in the field
    if dist[hexagon] < +infinity then
        the hexagon is inside colored area around the unit
    end-if
end-loop