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