如何获得网格上节点之间的最短路径?

How to get shortest path between nodes on a grid?

我想计算2个节点之间的最短路径。每个节点的位置类似于 [1,2]。当我使用 BFS 遍历节点时,我将每个节点标记为已访问并添加与起始节点的距离。当找到结束节点时,我想调用一个函数,传递开始和结束节点并获得最短路径

输入:

[3,3], [5,6], [all visited] (output included in all visited)

期望的输出:

[[3,4], [3,5], [3,6], [4,6]]

如何过滤所有访问过的以获得最短路径?

如果我没理解错的话,你问的是如何从找到目标的 breadth-first 搜索中重建最短路径。

有几种方法可以做到这一点,但一种方法是将您的 visited-marking 变成一个标记,并向后引用您来自的节点。

Wikipedia 上,您可以找到伪代码,其中此反向引用是节点的 parent 属性:

procedure BFS(G, root) is
     let Q be a queue
     label root as discovered
     Q.enqueue(root)
     while Q is not empty do
         v := Q.dequeue()
         if v is the goal then
             return v
         for all edges from v to w in G.adjacentEdges(v) do
             if w is not labeled as discovered then
                 label w as discovered
                 w.parent := v
                 Q.enqueue(w) 

尽管您可以为“已访问”(或“已发现”)保留一个单独的布尔标志,但您可以仅使用此 parent 属性 来保存 space:如果它是 non-null,认为该节点已访问。

找到目标节点后,您可以通过parent back-reference 属性向后走,直到到达起始节点。就这样一边走一边修路不难:

     if v is the goal then
         let path be a stack
         path.push(v)
         while v is not the root do
             v := v.parent
             path.push(v)
         return path

请注意,根据用于 path 的实际数据结构,您可能需要反转它。