在矩阵中找到最短路径的算法

时间:2013-11-29 16:32:07

标签: c# algorithm matrix path lua

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

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

每个点只能得到以下几点的值:

  1. 上面的点。
  2. 它下面的一点。
  3. 留给它的点。
  4. 正确的观点。
  5. 并使事情变得更加困难:对于每一点,其他点的价值可能会有所不同。例如:

    1. 开放点是0,0。 0,1的值是1;
    2. 开放点是0.2。 0,1的值为0。
    3. 我可以计算出这个值,所以对你来说无关紧要...... 所以我认为解决问题的唯一方法是使用递归,因为最后一个条件,但如果你找到另一种方式,那么欢迎你。

      解决方案应该是 LUA C# JAVA

1 个答案:

答案 0 :(得分:4)

您可以简单地将矩阵解释为图形。每个单元(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只有两条评论:

  1. 仅检查是否存在连接。如果您确实想要拥有最短路径,则需要更改以下内容。当从其邻居t看到新的顶点u被添加到队列时,您必须在指向t的u处存储链接。当您最终找到目标时,返回链接会为您提供最短的路径。

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