시작 지점과 끝점이 지정된 2 차원 배열에 BFS를 구현하려고합니다. 그리드에서 두 점을 내 함수에 제공하려고 시도했지만 경로가 없다는 의미의 빈 배열을 반환합니다.경로를 반환하지 않는 BFS
누군가 내가 잘못 가고있는 부분을 지적하고 가능한 경우 실수를 바로 잡을 수 있도록 도와 줄 수 있습니까? 감사.
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()]);
}
편집 :
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()]);
간단한'Collections.reverse (path); 대신에 회선 코드의 마지막 7 줄을 사용해야하는 이유는 무엇입니까? –
'Point'의 정의도 게시하십시오. 더 나은 아직 MCVE (http://stackoverflow.com/help/mcve) –
('false로'방문한 요소를 초기화하는 것은 중복 됨) – greybeard