繁体   English   中英

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

[英]Finding the shortest path in a maze graph using adjacency matrix

我在解决特定问题(在迷宫图中找到最短路径)时遇到一些麻烦。 大概是因为迷宫是由一个四维数组初始化的,所以我陷入了困境,例如neighbor 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]));

首先,这个

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

与此矛盾:

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

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

Dijkstra的算法应针对您的矩阵实施。 引用:

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

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

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

  3. 对于当前节点,请考虑其所有未访问的邻居并计算其暂定距离。 将新计算的暂定距离与当前分配的值进行比较,然后分配较小的值。 例如,如果当前节点A标记为6,并且将其与相邻节点B的边的长度为2,则到B的距离(通过A)将为6 + 2 = 8。标记的距离大于8,然后将其更改为8。否则,请保留当前值。

  4. 考虑完当前节点的所有邻居后,将当前节点标记为已访问,并将其从未访问的集合中删除。 访问过的节点将不再被检查。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM