c++ - 通过矩阵中 N 个检查点的两点之间的最短路径

标签 c++ shortest-path

如何在矩阵中找到两点(即 S 和 D)之间的最短路径?它应该通过多个名为 & 的检查点。它不能通过 G。 * 表示一个打开的门。路径可以多次通过目的地和检查点。

示例:

GGGGG
GS**G  
GGDGG  
G**&G  
GGGGG

此矩阵的输出应为 6。

最佳答案

当您只有一个必须访问的航点时,问题就很简单了。您找到到路点的路径(例如,使用 A*),然后找到从路点到目标的路径。

当路标数量增加时,问题会呈指数级增加,因为您必须考虑接下来访问任何路标。这变成了 Traveling Salesman Problem .

一般的方法是通过选择下一个看起来最好的航路点来近似最短的解决方案,或者通过尝试所有可能性来找到最佳解决方案。 (上面链接的维基百科页面进入这些。)

但是,您需要对这些进行自己的研究——这远远超出了我们在这里可以帮助您的范围。

下一步是选择一种实现方法。如果您不理解它,您可以具体询问该方法的某些方面是如何工作的。但是,完整的解决方案很复杂,因此对于这样一个一般性问题,您不会获得太多编码帮助。


对于最佳解决方案,您最好的选择是深度优先分支定界搜索。这是一个带有修剪的深度优先搜索——消除肯定比你目前最好的解决方案更糟糕的路径。您可以在许多页面上找到有关该算法的信息,包括 this one ,但如果您有关于如何实现特定算法的问题,您应该开始研究该算法,然后提出一个新的问题。

这里的两个问题都以与您自己的问题相同的详细程度回答了您关于如何执行此操作的问题。没有人会在这里为您发布完整的源代码解决方案,因为这听起来像是类作业。当您开始实现某事并遇到困难时,请随时提出另一个问题,了解究竟是什么让您陷入困境。

关于c++ - 通过矩阵中 N 个检查点的两点之间的最短路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25428848/

相关文章:

ruby - 获取具有加权顶点和边的图中的路径

c++ - 模板中的错误 std::bad_array_new_length

c++ - 主函数体未检测到对重载可变参数模板函数 C++ 的调用

c++ - 管道以提供文件作为 C 程序的输入

dijkstra - 我可以使用 Prim 算法代替 Dijkstra 算法来查找最短路径吗?

java - BFS最短路径: Edge weight either 1 or 2

c++ - 构建动态分配的类对象数组

c++ - 使用 C++ 将 QML 元素动态添加/插入到 QML View 中

c++ - 在至少访问 X 节点一次的图中查找最短路

algorithm - 是否有任何有效的算法可以找到最短周期长度?