Ich versuche, BFS auf einem 2d-Array mit dem Start- und Endpunkt zu implementieren. Ich habe versucht, meine Funktion zwei Punkte auf dem Gitter zu geben, aber es gibt ein leeres Array zurück, was bedeutet, dass es keinen Pfad gibt.BFS gibt keinen Pfad zurück
Kann jemand bitte zeigen, wo ich falsch liege und, wenn möglich, mir helfen, meinen Fehler zu korrigieren? Vielen Dank.
public Point[] bfs2(Point start, Point end) {
boolean[][] visited = new boolean[50][50];
for (int i = 0; i < visited.length; i++)
for(int j = 0; j < visited.length; j++)
visited[i][j] = false;
visited[start.getX()][start.getY()] = true;
LinkedList<Point> path = new LinkedList<>();
Queue<Point> q = new LinkedList<>();
q.add(start);
while (!q.isEmpty()) {
Point next = q.remove(); //i think the error is here
Point[] neighbours = next.getNeighbours();
path.add(next);
if (next.getX() == end.getX() && next.getY() == end.getY())
break;
else if (!visited[next.getX()][next.getY()]) {
for (Point neighbour : neighbours) {
if (!visited[neighbour.getX()][neighbour.getY()]) {
q.add(neighbour);
}
visited[neighbour.getX()][neighbour.getY()] = true;
}
}
}
Point current = path.removeLast();
ArrayList<Point> v = new ArrayList<>();
while (current.getX() != start.getX() || current.getY() != start.getY()) {
v.add(current);
current = path.removeLast();
}
return v.toArray(new Point[v.size()]);
}
EDIT:
Point current=q.peek();
ArrayList<Point> v=new ArrayList<>();
if(start.getX()==end.getX() && start.getY()==end.getY()) return new Point[0];
while(current.getX()!=start.getX() || current.getY()!=start.getY()){
v.add(current);
current=current.parent;
}
return v.toArray(new Point[v.size()]);
ein Grund für die letzten 7 Zeilen von gewundenen Code anstelle einer einfachen 'Collections.reverse (Pfad);'? –
Bitte poste auch deine Definition von 'Point'. Besser noch, machen Sie es zu einem MCVE (http://StackOverflow.com/Help/Mcve) –
(Initialisierung der Elemente von 'besucht' zu 'false' ist redundant.) – greybeard