如何获取项目之间的所有路径

时间:2019-05-01 17:02:12

标签: java recursion

我必须计算列表中两项之间的所有可能路径。每个项目都有两个字段:其名称和其邻居的名称。

我必须生成一个包含所有项目的列表,这样我才能在两个特定项目之间建立路径。

想象一下,我有Item(A,B)和Item(A,C),并且被要求从B到C的解决方案。我必须将两个Item都返回,因为我可以通过使用它们从B到达C :B-> A-> C。

请注意,我对到达目的地所需的物品没有限制。

我尝试了几种解决方案,但都没有成功。我知道我必须使用某种递归函数,但是我不知道怎么做。

这是我的Item类:

public class Item {
    private String name;
    private String neighbor;

    public Item(String name, String neighbor){

        this.name = name;
        this.neighbor = neighbor;
    }

    //getters and setters
}

由于我必须获取两个特定项目之间的所有可能路径,因此我必须返回一个列表列表:

List<List<Item>> solution;

我的解决方法

最后,我将项目转换为图,一旦构建完成,我就使用深度优先横向(DFT)来查找源和目标之间的所有可能路径。

我设置了一个键值对,将每个项目的名称与一个图形表示形式联系起来,然后从图形中获得一个整数列表,该列表指示图形中的路径(例如1-2-3-5)。从该列表中找到我的项目,然后以我已经说明的格式返回列表列表。

只为有类似问题的人发帖!

1 个答案:

答案 0 :(得分:1)

根据我的评论尝试这样的事情:

  

您可以遍历每个节点并在以下位置执行深度优先搜索   每个节点看是否可以到达所需节点

您标记访问的节点既可以避免循环(如果在您的用例中甚至可以避免),也可以跟踪路径。

List<Item> depthFirstSearch(Item startItem, Item desiredItem, List<Item> visitedNodes) {
    if (startItem.equals(desiredItem)) {
        return visitedNodes;
    }

     // Exit if we reach a cycle or no more neighbors to follow
    if (visitedNodes.contains(startItem) || startItem.getNeighbor() == null) {
        return null;
    }

    visitedNodes.add(startItem); 

     // Recurse; continue search from neighbor
    return depthFirstSearch(startItem.getNeighbor(), desiredItem, visitedNodes);
}

并像这样使用它(您需要对此进行调整以适应您的代码):

List<Item> items;
List<List<Item>> result = new List<List<Item>>();

for (Item item : items) {   
    List<Item> pathToDesired = depthFirstSearch(item, desiredItem, new LinkedList<Item>());

    if (pathToDesired != null) {
        results.add(pathToDesired);
    }
}

result将包含所需项目的所有路径。