Javascript 如何获得网格上节点之间的最短路径?
我想计算两个节点之间的最短路径。每个节点的位置类似于[1,2]。当我使用BFS在节点上迭代时,我将每个节点标记为已访问并添加到起始节点的距离。当找到结束节点时,我想调用一个函数,传递开始和结束节点,并获得最短路径 输入:Javascript 如何获得网格上节点之间的最短路径?,javascript,algorithm,breadth-first-search,Javascript,Algorithm,Breadth First Search,我想计算两个节点之间的最短路径。每个节点的位置类似于[1,2]。当我使用BFS在节点上迭代时,我将每个节点标记为已访问并添加到起始节点的距离。当找到结束节点时,我想调用一个函数,传递开始和结束节点,并获得最短路径 输入: [3,3], [5,6], [all visited] (output included in all visited) 期望输出: [[3,4], [3,5], [3,6], [4,6]] 如何筛选所有访问的站点以获得最短路径?如果我理解正确,您会问如何从找到目标的广度优
[3,3], [5,6], [all visited] (output included in all visited)
期望输出:
[[3,4], [3,5], [3,6], [4,6]]
如何筛选所有访问的站点以获得最短路径?如果我理解正确,您会问如何从找到目标的广度优先搜索中重建最短路径 有几种方法可以做到这一点,但其中一种方法是将访问的标记转换为带有对来自的节点的反向引用的标记 在上,您可以找到伪代码,其中该反向引用是节点的
父属性:
尽管您可以为“访问”(或“发现”)保留一个单独的布尔标志,但是您可以通过使用这个<代码>父< /代码>属性来节省空间:如果它是非空的,请考虑访问的节点。
找到目标节点后,可以通过parent
back引用属性向后走,直到到达起始节点。当你像这样往回走的时候,建造道路并不困难:
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
请注意,根据路径所使用的实际数据结构,您可能需要将其反转。如果不需要BFS,则可以使用DFS来维护堆栈和推送节点,并在有回溯时弹出节点。堆栈将描述访问目标节点时的最短路径。
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