未排序节点阵列的路径查找算法

时间:2018-10-15 12:03:41

标签: sorting graph-algorithm path-finding maze

场景: 我有一个地图,巫婆节点连接在一起。

  • 我有所有节点的未排序数组。
  • 我具有检查节点是否相互连接(如果node1连接到node2)的功能。

function areNodesConnected(node1, node2) return true/false;

请求: 我正在寻找使用此功能的算法(伪代码)来查找2个随机节点之间的路径。

结果应该是从节点1开始的节点1和节点2在阵列的末尾对节点进行排序的数组。如果2个节点之间没有路径,则返回null。

注意:

  • 不需要最短的路线
  • 如果还有更多路径,请选择第一个可能

谢谢您的建议。 我并没有要求完整的解决方案,而是要求从哪里开始解决这个问题。

1 个答案:

答案 0 :(得分:1)

我们可以使用DFS(深度优先搜索)来找到答案。

让我们维护一个堆栈和一个访问数组,以跟踪先前访问的节点。我们还需要跟踪父节点的每个节点,以获得最终答案。如上所述,使用功能areNodesConnected(node1,node2)检查边缘。

步骤

  1. 创建一个堆栈,父数组和访问数组。
  2. 将起始节点推入堆栈。
  3. 当堆栈不为空时:弹出堆栈,然后将连接到弹出节点的所有节点推入堆栈。 (具有areNodesConnected函数)通过​​父数组跟踪节点的来源。
  4. 遍历父数组以获得最终答案。

伪代码

function findPath(int start, int end, int nodes):
    stack = Stack
    parent = array of integers to keep track of parents, set every value to -1 to start with
    vis = visited array of booleans to keep track of previous nodes

    stack.push(start)
    parent[start] = start // setting the starts parent to itself so we know when to stop searching.

    while stack is not empty:
        int x = stack.pop()
        for y in range 0 to nodes:
            if areNodesConnected(x, y) and not vis[y]: // checking if there is an edge from x to y
                stack.push(y)
                parent[y] = x; // store the parent of y
        vis[x] = true

    // now we have to print our final answer

    if parent[i] == -1:
        return null // there is no path

    list = List for final answer    

    for (int i = end; parent[i] != i; i = parent[i]): // recursively set i to it's parent until it is the starting node.
        list.add(i)

    // now lets add start
    list.add(start)

    return list

上述解决方案的唯一问题是列表与您想要的相反。