Я объясню это на примере:
A - B - D
|
C
Когда код попадает на узел C, он не находит других вершин для перехода к: v == -1
. Что происходит потом, он очищает C и возвращается к B. Это все хорошо. Но в B мы знаем только, откуда мы пришли (стек содержит [A,B]
). Теперь он находит первую непосещенную вершину, но это снова C!
Что вам нужно, когда вы поднимаетесь из C в B, а затем находите следующую вершину для посещения. Вам нужно перечислить все соседние по порядку.
int getNextAdjVertex(int currentVertex,int vertexICameFrom) {
return the first vertex adjacent to currentVertex, bigger than vertexICameFrom
or -1 if it does not exist
}
if (v == -1) {
vertexList[lastVisited].wasVisited = false;
System.out.println("Go back to: " + theStack.peek());
//going down in the right direction:
int backTo = theStack.peek();
int newDestination = getNextAdjVertex(backTo,lastVisited);
//now same as the else part, a step downward
vertexList[newDestination].wasVisited = true;
lastVisited = newDestination;
System.out.println("Visited: " + newDestination);
theStack.push(newDestination);
}
Есть только одна маленькая проблема, если newDestination == -1
вам нужно подняться еще на один уровень. Вы должны будете делать это в цикле, поднимаясь до тех пор, пока не появится непосещенная вершина.
Я думаю, что проблема в getNextAdjVertex.
System.out.println("Go back to: " + theStack.peek()+","+lastVisited);
даст более полезную информацию для поиска проблемы. Но я думаю, что это должно работать:
public int getNextAdjVertex(int currentVertex, int vertexICameFrom) {
for (int j = vertexICameFrom+1; j < nVerts; j++) {
if (adjMat[currentVertex][j] == 1 && !vertexList[j].wasVisited) {
return j;
}
}
return -1;
}