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

问题描述

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

输入:

bottom navigation view

所需的输出

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

如何过滤所有访问者以获取最短路径?

解决方法

如果我的理解正确,您是在问如何从找到目标的广度优先搜索中重建最短路径。

有多种方法可以执行此操作,但是一种方法是将您访问过的标记转换为带有对您来自的节点的反向引用的标记。

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) 

尽管您可以为“ visited”(或“ discovered”)保留一个单独的布尔标志,但是您可以通过使用此parent属性来节省空间:如果该属性为非null,请将该节点视为已访问

找到目标节点后,您可以通过parent后向引用属性向后走,直到到达起始节点。像这样往回走的过程并不难:

     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使用的实际数据结构,您可能需要将其反转。