问题在于:
我必须找到从起点到目的地的路径,并考虑以下因素。
在给定的图表中,一个点可以是:
(1)检查点 - >这一点必须 在计算的最终路径中
(2)矿井 - >这一点不应该 在计算的最终路径中
(3)中性点 - >这一点
可能/可能不在最后的中
路径计算
我需要一个算法。
答案 0 :(得分:4)
首先移除地雷并列出检查点。
然后你几乎肯定要进行深度优先或广度优先搜索。哪一个取决于图表。我建议尝试广度优先搜索,并使用适当的修剪启发式方法。寻求者从起始点开始,然后只要它有选择让它自己复制并且双向进行。它保留了两个列表:它访问过的检查点,以及自上一个检查点以来访问的中性节点。当它访问中性节点时,它将其检查点列表写在墙上,并擦除任何自己的子集列表。如果遇到下列情况之一,它将自行终止:
这应该足以让你入门。根据图表,还有其他优化(例如删除死角)可能是值得的。
(编辑:当我看到它会使某些图表变得不可能时,抓住了最后一个条件。)
答案 1 :(得分:2)
如果需要按特定顺序访问检查点, Dijkstra算法是一个简单的解决方案。您可以将该算法用于图的子集。子集将是图形,其中起始节点和结束节点是检查点(或图的开始或结束节点)。您可以使用边权重来表示不应访问的节点。
但是,我建议使用 A * Pathfinding ,因为它可能更适合您要做的事情。那里有很多示例代码。
这是一个很好的教程,可以帮助您入门:
您可以在图表中将您的地雷和检查点表示为权重,或使用启发式方法。这很可能取决于是否订购检查站。
Gamedev.net是你的朋友。祝你好运!
答案 2 :(得分:1)
好吧,我认为你可以使用Dijkstra's algorithm(或类似的东西,我建议Dijkstra的,因为它是详尽的和一般的,你没有提供有关你的数据的那么多信息)来找到最短的路径..经过这些修改:
Dijkstra将找到最短路径(权重最低的路径),保证越过所有检查点并避开所有地雷。
虽然这不是一个快速算法,但如果您的地图太大,它可能无效。
答案 3 :(得分:1)
就我个人而言,我会使用深度优先搜索(DFS)。 Dijkstras算法用于计算最短路径,基于一些边缘距离函数(您没有提到节点之间的任何距离,所以我假设没有)。
因此可以修改DFS(假设s是你的来源而t是目的地):
这可能不是最有效的算法,但应该用于查找路径。也没有承诺从DFS结果中选择的路径是最佳路径。
(这假设可以按任何顺序访问检查点)