使用邻接矩阵在迷宫图中找到最短路径

时间:2015-05-31 13:42:29

标签: java graph shortest-path maze

我在解决一个特殊问题时遇到了一些麻烦,即找到迷宫图中的最短路径。可能是因为迷宫由四维数组初始化而被困住了 adjacent = new boolean[height][width][height][width]; 第一对和第二对索引在行/列形成中指定图中的位置。该图如下所示:

XXXXXXXXXXXXX
..........X.X
X.XXX.XXX.X.X
X.X.X...X.X.X
X.X.XXX.XXX.X
X...X.....X..
XXXXXXXXXXXXX

ArrayList必须按照从开始到结束的顺序保存路径中顶点的位置。

我已经编写了构造函数和连接方法;但是,我找到了最短路径方法的问题。 以下是我如何创建迷宫图的示例:

final int edges[][] = {{1, 0, 1, 1}, {1, 1, 1, 2}, {1, 1, 2, 1}, 
                {1, 2, 1, 3}, {1, 3, 1, 4}, {1, 4, 1, 5}, {1, 5, 1, 6}, 
                {1, 5, 2, 5}, {1, 6, 1, 7}, {1, 7, 1, 8}, {1, 8, 1, 9}, 
                {1, 9, 2, 9}, {1, 11, 2, 11}, {2, 1, 3, 1}, {2, 5, 3, 5}, 
                {2, 9, 3, 9}, {2, 11, 3, 11}, {3, 1, 4, 1}, {3, 3, 4, 3}, 
                {3, 5, 3, 6}, {3, 6, 3, 7}, {3, 7, 4, 7}, {3, 11, 4, 11}, 
                {4, 1, 5, 1}, {4, 3, 5, 3}, {4, 7, 5, 7}, {4, 11, 5, 11}, 
                {5, 1, 5, 2}, {5, 2, 5, 3}, {5, 5, 5, 6}, {5, 6, 5, 7}, 
                {5, 7, 5, 8}, {5, 8, 5, 9}, {5, 11, 5, 12}};

        MazeGraph maze = new MazeGraph(13, 7); 

        for (int[] edge : edges) 
            maze.connect(new Location(edge[0], edge[1]), new Location(edge[2], edge[3]));

1 个答案:

答案 0 :(得分:0)

首先,这个

adjacent = new boolean[height][width][height][width];

与此相矛盾:

  

第一对和第二对索引指定图表中的位置   在行/列形成。

它是列/行,而不是行/列。

应该为您的矩阵实施

Dijkstra's algorithm。引用:

  

让我们开始的节点称为初始节点。让   节点Y的距离是从初始节点到Y的距离。   Dijkstra的算法将分配一些初始距离值并且将会   尝试逐步改进它们。

     
      
  1. 为每个节点分配一个暂定距离值:将其设置为零   我们的初始节点和所有其他节点的无穷大。

  2.   
  3. 将初始节点设置为当前节点。标记未访问的所有其他节点。创建一组称为未访问集的未访问节点。

  4.   
  5. 对于当前节点,考虑所有未访问的邻居并计算其暂定距离。比较新计算的   到当前指定值的暂定距离并指定   较小的一个。例如,如果当前节点A标有a   距离为6,与邻居B连接的边缘长度   2,那么到B(通过A)的距离将是6 + 2 = 8.如果B是   之前标记的距离大于8,然后将其更改为8。   否则,保持当前值。

  6.   
  7. 当我们考虑当前节点的所有邻居时,将当前节点标记为已访问并将其从   未经审查的集合。永远不会再次检查访问过的节点。

  8.   
  9. 如果目标节点已标记为已访问(在规划两个特定节点之间的路由时)或最小暂定   未访问集合中的节点之间的距离是无穷大(当   计划完整的遍历;没有连接时发生   在初始节点和剩余的未访问节点之间),然后停止。   算法已经完成。

  10.   
  11. 否则,选择标记有最小暂定距离的未访问节点,将其设置为新的“当前节点”,然后转到   回到第3步。

  12.