【问题标题】:Finding the shortest path in a maze graph using adjacency matrix使用邻接矩阵在迷宫图中找到最短路径
【发布时间】:2015-05-31 13:42:28
【问题描述】:

我在解决一个特定问题时遇到了一些麻烦,即在迷宫图中找到最短路径。可能,我被卡住了,因为迷宫是由一个四维数组初始化的,比如 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]));

【问题讨论】:

  • 你听说过Dijkstra算法吗?

标签: java graph shortest-path maze


【解决方案1】:

首先,这个

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

与此矛盾:

第一对和第二对索引指定图中的位置 以行/列的形式。

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

Dijkstra's algorithm 应该为您的矩阵实现。引用:

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

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

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

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

  4. 当我们考虑完当前节点的所有邻居后,将当前节点标记为已访问并将其从 未访问集。被访问的节点将永远不会被再次检查。

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

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

【讨论】:

    猜你喜欢
    • 2012-04-08
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多