如何找到网格中两个单元格之间路径中的最窄点

时间:2012-10-29 00:22:53

标签: c++ algorithm game-physics

我正在为rts游戏编写机器人(一个村庄与另一个村庄在网格地图上,还有可交叉的细胞 - 草地,森林和非可交叉的细胞 - 水,山丘)。如何找到这两个细胞之间路径上的最窄点?算法的任何建议? (我使用A *找到最近的路径,我想要机器人决定把塔放在哪里(强大的防御建筑物),穿上最窄的点让敌人无法穿越 - 可能,取决于地图,但不太可能)

2 个答案:

答案 0 :(得分:4)

一些想法。

考虑一个(可能太多)简化版本,其中X代表不可交叉的单元格,。代表交叉,A代表一个村庄,B代表另一个。

XXXA.XXXXX
XXX..XXXXX
XX.....XXX
XXX....XXX
XXX...XXXX
XXX.....XX
XXXX....XX
XXXX.BXXXX

由于在连接两个村庄的道路上没有“分支”,我们可以将地图转移到

    000A100000
    0001100000
    0011111000
    0001111000
   C0001110000D
    0001111100
    0000111100
    00001B0000

其中0和1表示在单元格上行驶的成本。道路上最窄的点是从C到D旅行的最小路径。路径在下面的地图中用#表示

    000A100000
    ##########
    #01111100#
    #00111100#
   C#00111000#D
    0001111100
    0000111100
    00001B0000

由于只有原始地图“道路”上的单元格成本大于0,因此最小化C和D之间成本的最短路径确实会给出道路上“最窄点”位置的线索。 / p>

这只是一个简化版本,因为只有一条连接两个村庄的“主要道路”。但我希望它能以某种方式指出解决方案的正确方向。

答案 1 :(得分:2)

请记住,这甚至不一定是你想要的。考虑具有攻击范围T

的塔t
..t..
.ttt.
ttTtt
.ttt.
..t..       

和分支图,其中有一条狭窄的直接路径和一条从点A到点B的宽间接路径。假设标记为A的{​​{1}}附近的直接点是可步行的,但不适用于塔。

n

最初,字符将遵循路径xBxxxxxxx x.......x x.......x x.......x x..xx...x x..xx...x x..xx...x x.......x xnnn....x xnnn....x xAnxxxxxx

p

xBxxxxxxx xp......x xp......x xp......x xp.xx...x xp.xx...x xp.xx...x xp......x xp......x xp......x xA.xxxxxx 置于最窄点,如果角色继续在同一路径上,则会导致3次点击。但是,如果塔的疼痛相对于速度的目标而言是高的,那么这不会发生。当然如果致命的话。相反,角色将被转移到更长的路径。

T

在这种情况下,更好的位置是保证至少一次击中的位置。 (请注意,xBxxxxxxx xp......x xppppp..x x.t..p..x xttxxp..x xtTxxp..x xttxxp..x x.t..p..x x....p..x xppppp..x xA.xxxxxx 靠近T的最佳展示位置被认为是不可构建的。)

A

因此,您可能想要的是xBxxxxxxx x.......x x.......x x.......x x..xx...x x..xx...x x.txx...x xttTtt..x x.ttt...x x..t....x xA.xxxxxx 的展示位置,以最大限度地增加 T展示位置后计算的最低费用路径的费用。查看maximin(minimax)算法。当然,还有其他需要考虑的事项,例如塔本身的防御性。