如何在矩阵中找到两点之间的最短路径,即S和D?它应该通过名为&的多个检查点。它不能通过G. *代表一个开放的门。路径可以多次通过目的地和检查点。
示例:
GGGGG GS**G GGDGG G**&G GGGGG
此矩阵的输出应为6。
答案 0 :(得分:3)
当您只有一个必须访问的航点时,问题很容易。你可以找到航路点的路径(例如使用A *),然后找到从航路点到目标的路径。
当航点数量增加时,问题变得越来越难,因为你必须考虑接下来访问任何航路点。这变为Traveling Salesman Problem。
一般方法是通过选择下一个最佳的航路点来近似最短的解决方案,或者通过尝试所有可能性来找到最佳解决方案。 (上面链接的维基百科页面就是这些。)
但是,您需要对这些进行自己的研究 - 远远超出我们在这里可以帮助您的范围。
下一步是选择一种实施方法。如果您不了解它,您可以具体询问该方法的某些方面是如何工作的。但是,完整的解决方案很复杂,因此您无法通过这样的一般性问题获得更多编码帮助。
对于最佳解决方案,您最好的选择是深度优先分支和边界搜索。这是一个深度优先搜索修剪 - 消除路径,保证比您目前为止最好的解决方案更糟糕。您可以在许多页面上找到有关算法的信息,包括this one,但如果您对如何实现特定算法有疑问,则应该开始使用该算法,然后询问 new 关于那个的问题。
如何这样做的问题已经通过这两个问题在您自己的问题的详细程度上得到了回答。没有人会在这里为您发布完整的源代码解决方案,因为这听起来像是一个类分配。当你开始实施并陷入困境时,请随意提出另一个问题,确切地说是什么让你陷入困境。
答案 1 :(得分:1)
对于这类问题,您需要执行两个步骤:
S
,D
和&
点重建图表,并且原始路径中每条边的权重最短路径在第一步计算,然后问题变成典型的Travelling Salesman Problem。