【发布时间】: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