我有一个编程任务,可以在“扇区”中找到从START到GOAL的最短路径。您可以将Sector可视化为2D节点阵列,其中一个节点为START,另一个节点为GOAL。所有其他节点都是FLAT或HILL。你不能越过山丘。例如:
0123456789
|----------| {S = START, G = GOAL, " " = FLAT, # = HILL}
0|S |
1|##### |
2| |
3| |
4| |
5| |
6| |
7| |
8| #######|
9| G|
|----------|
好的,所以我实现了Dijkstra的算法来提出从S到G的最短路径。但还有一个我无法弄清楚的问题,我会很感激一些建议。如果它让我们找到一条较短的路径,我们将获得5枚炸弹炸毁希尔斯。因此对于我发布的示例部门,我想使用2个炸弹来获得这样的路径:
0123456789
|----------| {S = START, G = GOAL, " " = FLAT, # = HILL, + = PATH}
0|S |
1|#+### | Blasted away HILL @ [1][1]
2| + | 4 bombs remaining
3| + |
4| + |
5| + |
6| + |
7| + |
8| #####+#| Blasted away HILL @ [8][8]
9| G| 3 bombs remaining
|----------|
用于测试程序的扇区是100x100并且有很厚的“山脉”,所以只有5枚炸弹,你可以直接射向目标或任何东西。
有关如何智能地使用炸弹时如何计算的想法?现在,我有一个临时实施,只是说“如果您当前正在查看的节点是一个山丘并且您有炸弹,那么就会爆炸”。显然,这不会削减它,但我想不出如何正确地做到这一点。
感谢您的帮助。
答案 0 :(得分:0)
我假设在你的第一个解决方案中你有一个图形连接,你有一个只连接Flat空间的图形。我建议你为每个希尔创造高成本优势。每个进入希尔的边缘成本为例如100000单位。所有其他边缘成本为1个单位(仅作为示例)。
在您的第一个示例中,您可以在(0,0) -> (0,1)
之间有一个优势,成本为100000.
因此,如果累计成本大于或等于(bombs + 1)*100000
,您将需要停止搜索(在Dijkstra中,如果搜索相邻节点的成本)。
基本思想是你的算法会尽量降低成本,使用炸弹是非常昂贵的。当然,最短的路径将找到炸弹最少的路径。如果你在最小路径上有5个炸弹,那么费用将是500000加上穿越平坦地形的费用。