问题
假设我有一个(无限)六角形平铺。从1个六边形开始,除了一些“空心”六边形,我可以移动到每个相邻的六边形。一些六角形的权重为1,另一些六角形的权重为2。最大权重为x
的情况下,如何从x
以下的起始十六进制中获取具有累积权重的所有六角形?
上下文
我正在尝试为《文明5》游戏制作模组。在其中,我需要获得一个单位可以在10圈内进入的所有瓦片的集合,知道这个单位每圈有1个移动点,并且除道路以外的每块瓷砖要花费1 MP(道路成本0.5)。山地和海事瓷砖无法访问。 简而言之,它是所选单位周围显示区域的扩展版本,显示了在单位1圈距离内的所有图块。
当前测试
到目前为止,我已经尝试了2种解决方案,但是似乎没有一个非常有效。我的大多数尝试都无法得知要检查的图块(因为尚未检查它们,或者因为尚未检查最短路径,因为它们尚未被检查),最后一次检查了范围内的每个图块,并且拒绝看似在范围内但已从比所需的更长的路径检查的几块瓷砖,以为它们太远了。
x
。在执行此操作时,我真的需要一些建议。
谢谢你, 梅塔
答案 0 :(得分:1)
您应该使用Dijkstra的算法来找到通往附近瓷砖的最短路径。由于Dijkstra的算法会按照长度增加的顺序找到最短路径,因此,当找到比x
长的最短路径时,您就可以停下来。
答案 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