图形节点不会遍历所有相邻节点?

时间:2014-06-20 20:26:56

标签: java recursion graph

我遇到了图表分配方面的麻烦,我遇到了一个我似乎无法找到的问题。

System.out.println(plattegrond.getGraph().neighbours("Een").toString());
System.out.println(plattegrond.isRoute("Een", "Drie", new HashSet<String>()));

这些代码行打印

[Twee, Drie, Vier]
false

看来,“Een”有“Twee”,“Drie”和“Vier”作为邻居。 但是,isRoute方法返回false。方法如下所示。

public boolean isRoute(String nodeA, String nodeB, Set<String> visited) {

        visited.add(nodeA);

        if(nodeA.equals(nodeB)) {
            return true;
        }

        for(String neighbour : graph.neighbours(nodeA)) {
            if(!visited.contains(neighbour)) {
                return isRoute(neighbour, nodeB, visited);
            }
        }
        return false;

    }

我已经使用调试器跟踪了所有步骤,并且在增强的for循环中,“Drie”不会作为邻居出现。然而,“Twee”和“Four”将会。如果我试图找到“Zes”的路径,也会出现同样的问题。当我问“Twee”它的邻居是什么时,它会说

[Een, Vier, Zes]

当我要求它找到“Zes”的路线时,isRoute方法将再次返回false。再次 “Zes”不会作为邻居出现在循环中。 但是,当我要求它找到“Twee”或“Four”的路线时,它将返回true。

我完全失去了这个。

1 个答案:

答案 0 :(得分:0)

那里有一个问题...在你的for中你有IF语句返回..第一个邻居是Twee而它不在列表中所以它将访问Twee并且永远不会回到下一次迭代因为那个退货声明。

尝试使用布尔变量并执行以下操作:

boolean b = false;

for(String neighbour : graph.neighbours(nodeA)) {
        if(!visited.contains(neighbour)) {
           // this statement can never change b to false once it becomes true
           // and you make sure you return after checking your whole set of neighbours
            b = b || isRoute(neighbour, nodeB, visited);
        }
    }

return b;

这可能不是确切正确的解决方案,但至少现在你知道你的问题在哪里......你在第一个项目之后返回而不是遍历所有邻居。