【问题标题】:Algorithm to find the shortest path in a matrix在矩阵中找到最短路径的算法
【发布时间】:2013-12-15 21:40:42
【问题描述】:

我试图找到解决以下问题的算法,但我找不到。

如果重要的话,你有一个矩阵,10X6。 (x 维度上 10 y 维度上 6)。 该算法接收 2 个点,即开盘点和目标点。 该数组充满了 0 和 1,它应该找到它们之间 1 的最短路径,并返回此路径中的第一个点(通往目标的下一个点)。 但这里有一个问题:

每个点只能获取以下点的值:

  1. 它上面的点。
  2. 它下面的点。
  3. 留给它的点。
  4. 正确的点。

让事情变得更加困难:对于每一点,其他点的价值可能不同。例如:

  1. 开始点是 0,0。 0,1的值为1;
  2. 开口点为 0,2。 0,1 的值为 0。

我可以计算出这个值,所以对你来说应该没关系... 所以我认为解决它的唯一方法是递归,因为最后一个条件,但如果你找到另一种方法,欢迎你。

解决方案应该是 LUAC#JAVA

【问题讨论】:

  • 你能告诉我们你尝试了什么吗?删除了[java],因为你说你不想要 Java。
  • 其实我不在乎你是否用java解决它,我会自己将它转换成另一种语言^_^我没有代码,因为我只是试图找到算法本身在真正写之前。
  • 即使有你的限制,Dijkstra 的算法不应该仍然有效吗?
  • 那么language-agnostic 可能是一个更好的标签
  • @user3050072 或者,您可以尝试实现它。当您遇到问题时,请在此处发布并告诉我们您尝试了什么以及为什么它不起作用。在你能表现出一点努力之前,我投票结束这个。将在建设性编辑后收回/重新投射

标签: c# algorithm matrix path lua


【解决方案1】:

您可以简单地将矩阵解释为图表。每个单元格 (i,j) 对应一个节点 v(i,j) 并且两个节点只有当它们对应的单元格是邻居并且都设置为 1 时才连接。

下面的示例矩阵有四个顶点v(0,0)、v(0,1)、v(1,0)和v(1,1),边为{v(0,0), v(0,1)} 和 {v(0,1),v(1,1)}(顶点 v(1,0) 是孤立的)。

1 1
0 1

由于您的图表未加权,您可以简单地使用广度优先搜索 (BFS) 来查找最短路径。伪代码见:http://en.wikipedia.org/wiki/Breadth-first_search#Pseudocode

矩阵中的每个条目只知道其相邻条目的限制无关紧要。当谈到图时,这意味着每个顶点都知道它的邻居,这正是你在 BFS 中所需要的。从不同的起点搜索时使用不同的图表也不会使问题变得更难。

上面链接的poseudocode只有两个cmets:

  1. 它只检查是否有连接。如果你真的想要最短路径,你需要改变以下。当从邻居 t 看到一个新的顶点 u 被添加到队列中时,你必须在 u 处存储一个指向 t 的链接。当您最终找到目标时,返回链接会为您提供最短路径。

  2. 使用集合来存储哪些元素已经被访问过是低效的。在您的情况下,只需使用与输入矩阵大小相同的布尔矩阵来标记访问的顶点。

【讨论】:

  • 队列确保您始终首先考虑最近的顶点。这对于确保您在第一次访问节点时已经找到到节点的最短路径是必要的。你有什么不想使用队列的原因吗?
  • 我只需要自己在LUA中实现队列。无论如何,谢谢,它会找到最短的方法,因为当它到达这一点时,算法将停止? (所以最快的方法是找到的唯一方法)。只是想确保我理解。 (对不起,如果我不清楚)
  • 是的,因为您的图表是无向的,所以您找到的所有路径都是最短路径。实现队列应该不会那么难(您不需要优先级队列,只需一个简单的队列)。例如,请参见此处:lua.org/pil/11.4.html
  • 是的,我已经实现了队列。感谢一切!完成后,我会将您的答案设置为已接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多