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

C++ 如何在网格中找到两个单元格之间路径上的最窄点,c++,algorithm,game-physics,C++,Algorithm,Game Physics,我正在为rts游戏编写机器人(网格地图上一个村庄对另一个村庄,也有可穿越的单元——草、森林和不可穿越的单元——水、山)。如何找到这两个单元格之间路径上的最窄点?对算法有什么建议吗?(我使用*来寻找最近的路径,我想机器人决定在哪里放置塔楼(坚固的防御建筑),放置在最窄的点上,这样敌人就无法穿越——可能可以,取决于地图,但可能性较小)。一些想法 考虑一个(可能太多)简化版本,其中X代表不可交叉的单元格。A代表一个村庄,B代表另一个村庄 XXXA.XXXXX XXX..XXXXX XX.....XXX

我正在为rts游戏编写机器人(网格地图上一个村庄对另一个村庄,也有可穿越的单元——草、森林和不可穿越的单元——水、山)。如何找到这两个单元格之间路径上的最窄点?对算法有什么建议吗?(我使用*来寻找最近的路径,我想机器人决定在哪里放置塔楼(坚固的防御建筑),放置在最窄的点上,这样敌人就无法穿越——可能可以,取决于地图,但可能性较小)。

一些想法

考虑一个(可能太多)简化版本,其中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之间的成本最小化的最短路径确实会提供道路上“最窄点”位置的线索


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

请记住,这甚至不一定是你想要的。考虑塔“代码> T <代码>攻击范围<代码> t<代码> < /p>
..t..
.ttt.
ttTtt
.ttt.
..t..       
以及一个分支图,其中从点
a
到点
B
有一条窄的直接路径和一条宽的间接路径。假设标记为
n
A
周围的直接点可以行走,但不能为塔楼建造

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                   
T
放置在最窄的点上,如果字符继续在同一路径上,将导致3次命中。但是,如果塔楼的疼痛与速度目标相比很高,则不会发生这种情况,例如,如果致命的话。相反,字符将被转移到较长的路径

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
的最佳位置被认为是不可构建的。)


因此,您可能需要放置
T
,以最大化放置
T
后将计算的最小成本路径的成本。研究maximin(minimax)算法。当然,还有其他的事情要考虑的位置,如防御塔本身。

固定地图,即不是随机生成的,它可以很好地预先确定一些理想的安置点作为启发式使用。显然,游戏可能会改变动态,但这些启发点将允许修剪您的搜索树。
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