我必须计算列表中两项之间的所有可能路径。每个项目都有两个字段:其名称和其邻居的名称。
我必须生成一个包含所有项目的列表,这样我才能在两个特定项目之间建立路径。
想象一下,我有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)。从该列表中找到我的项目,然后以我已经说明的格式返回列表列表。
只为有类似问题的人发帖!
答案 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
将包含所需项目的所有路径。