【问题标题】:How to do dijkstra's algorithm on a grid matrix如何在网格矩阵上执行 dijkstra 算法
【发布时间】:2020-08-15 20:49:49
【问题描述】:

所以我有一个可以是任何给定大小的网格(即矩阵或二维数组)。每个元素都包含一个值,我只需要找到最短路径。但是,我遇到的问题是尝试将此网格表示为图形或 adj 矩阵或您打算做的任何事情。例如这是我的代码:

public int shortestPath (int[][] matrix, int sr, int sc, int dr, int dc)
{
    int p = matrix.length * matrix[0].length;
    int[] distances = new int[p];
    boolean[] visited = new boolean[p]; //I think all are set to false by default

    for (int i = 0; i < p; i++)
    {
        distances[i] = Integer.MAX_VALUE;
    }

    PriorityQueue<Node> pq = new Priority<>(); // a Node holds the int row, int col and the distance from source cell. It also orders by distances, so therefore a comparable was created to change natural order.
    pq.add(new Node(sr,sc,0);
    distances[(sr * matrix[0].length) + sc] = 0;
    visited[(sr * matrix[0].length) + sc] = true;

    while(!pq.isEmpty())
    {
        Node n = pq.poll();
        int row = n.getRow();
        int col = n.getColumn();
        int dist = n.getDistance();

     //Now here with a normal graph I would search neighbours via a for loop and find in the adj list where an element = 1 and is not visited. This is where I am stuck
    }
}

显然,使用网格,我需要找到左/右/上/下的邻居(不做对角线)。因此,我需要考虑边界。如何创建一个 Adj 矩阵或开始为这样的网格搜索邻居的正确方法是什么?

我今天运气不好,因为大多数示例以图形形式显示到 adj 矩阵,而不是从网格形式显示到 adj 矩阵。

【问题讨论】:

  • Dijkstra 与图形的实际表示方式无关。看来你还没有完全理解这个算法,我建议你多学习一下。您所要做的就是放松每一步的所有向外边缘,这完全取决于您如何掌握这些边缘。看看它的伪代码而不是实际的实现,看一些动画,也许你会更好地理解算法。
  • @Zabuzard 我是新手,所以我会犯错误。但是我如何寻找邻居呢?通常它在 Adj 矩阵上一次完成一个邻居(BFS)。但是网格很难执行循环来找到邻居,因为我知道 i + 1, i -1, j + 1 和 j - 1 是可能的邻居。我也知道它将存储路径的距离与潜在新路径的距离进行比较。
  • 你知道节点的坐标。因此,正如您所分享的,您还知道所有邻居的所有坐标。现在只需检查if 他们是否仍在界内。如果是这样,请继续。如果没有,请跳过那个不存在的邻居。

标签: java algorithm data-structures priority-queue dijkstra


【解决方案1】:

网格图有一个技巧:

  1. 假设 {x,y} 表示 2 个相邻小区之间的差异
  2. 您知道邻居将位于 {0,-1}、{0,1}、{1,0} 或 {-1,0}(假设没有对角线移动),否则这些单元格将超出范围
  3. 保存这些差异的数组:
int differenceX[] = {0,0,1,-1};
int differenceY[] = {-1,1,0,0};
  1. 现在您可以为邻居使用 for 循环:
    for(int i=0; i<4; i++)
    {
        int neighRow = row + differenceY[i];
        int neighCol = col + differenceX[i];
        if(min(neighRow, neighCol) >= 0 && neighRow < matrix.length && neighCol < matrix[0].length){
            //process node
        }
    }

【讨论】:

  • OP 不知道的重要关键方面是if(notOutOfBound(...))。这将有助于 OP 向他展示这一点。 IE。坐标边界检查。
  • @Photon - 谢谢,现在说得通了。我想问一下,如果网格不是对称的,即 k * k 其中 k 是整数。你如何在那里有效地检查边界?例如 3 * 4 的网格。
  • @Willdomybest18 更新了一般矩阵情况的 if 语句
猜你喜欢
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
相关资源
最近更新 更多