我遇到了一个问题,我在解决方面遇到了一些麻烦。我正在尝试编写一个程序来解决一个m网格迷宫,其中有地雷。棘手的部分是玩家/迷宫跑者的生命数L> = 1,这意味着他们可以踩下最多的L - 1地雷,然后才能在下一枚地雷上死亡。
进一步详情:
- 每个细胞可以连接到任何相邻细胞。所有连接都是双向的。
- 我们可以假设迷宫在给定生命数量的情况下从开始到结束具有正确的路径。
- 迷宫可以包含环或“岛屿”。其中来自给定单元格的两条路径通向同一单元格。
我目前的想法:
我尝试过各种方法解决这个问题。有明显的蛮力解决方案,包括遍历每条可能的路径,并采取距离最短的路径。但这是指数时间。我觉得可能有类似Dijkstra或A *的解决方案导致O(n + vlogv)时间。 Vanilla Dijkstra或A *不会导致此问题的解决方案,因为图形的状态根据遍历的方式有效地改变。我也尝试了各种广度优先搜索+追踪回来开始使用优先级队列。经过进一步调查,这些方案可以导致指数时间。
到目前为止,我提出的最有希望的想法是将每个迷宫解析为图形并执行修改后的Dijkstra。具有三个或更多连接的每个单元将是节点。具有两个连接的每个单元是路径的一部分。可以丢弃具有一个连接的每个单元。最终结果是图表。然后你执行类似于Dijkstra的事情,但我还没有澄清解决方案。
我只能猜测这个解决方案需要一种在最佳情况下有效的算法,但在最坏的情况下可以成为指数。
答案 0 :(得分:1)
你绝对应该采用动态编程(DP)风格的算法。
如果您在这里添加了一个示例迷宫矩阵,那么我很容易理解这个问题。
你的问题与this非常相似。所以请仔细阅读。但在直接进入解决方案之前,请先阅读this tutorial。
答案 1 :(得分:0)
迷宫遍历期间的状态由单元格和剩余生命数组成,因此您可以将这些可能的遍历表示为具有N*L
个顶点的图形(其中N是单元格数。)< / p>
为了略微简化,您可以将所有L个最终顶点折叠成一个最终顶点,因为遍历结束时剩余生命的数量是无关紧要的。
然后,您可以使用任何最短路径算法来查找解决方案。
变换后的图形具有大约L倍的顶点和L倍的边数,因此它将复杂度乘以L²。
答案 2 :(得分:0)
将迷宫视为一个图形,每个清晰的正方形都有一个节点,每对连接的正方形之间有一条边。
设N是图中的节点数。为每个边分配N * k + 1的成本,其中k是它接触的地雷数(0,1或2)。这确保了在地雷上行驶比在清晰的广场上行驶要多花费2N。
现在使用Dijkstra算法找到通过图表的最短路径。