我想从广度优先搜索构建一条最短路径。我已经用Java代码实现了BFS(如下所示),但现在我不知道如何重构路径以从代码的实现中获取最短路径。
虽然我知道我必须保留一系列父母,但我不知道将它放在我的代码中。基本上,我想追溯使用BFS从起点到目标点的最短路径。请注意,我正在使用2D数组。
我做得对吗?有人可以帮帮我吗?
public ArrayList<Point> shortestPath=new ArrayList<>();
public ArrayList<Point> BFS(Point start, Point end){
int[][] distanceBoard=new int[50][50]; Point current,parent;
for(int i=0;i<distanceBoard.length;i++)
for(int j=0;j<distanceBoard.length;j++) distanceBoard[i][j]=Integer.MAX_VALUE;
distanceBoard[start.getX()][start.getY()]=0;
LinkedList<Point> q=new LinkedList<>();
q.addFirst(start);
while(!q.isEmpty()){
current=q.getFirst();
if((new Point(current.getX(),current.getY()))==end) return shortestPath;
q.removeFirst();
for(Point point:current.getNeighbours()){
if(distanceBoard[point.getX()][point.getY()]==Integer.MAX_VALUE){
distanceBoard[point.getX()][point.getY()]=distanceBoard[current.getX()][current.getY()]+1;
parent=current;
q.addLast(point);
}
shortestPath.add(current);
}
}return null;
}
答案 0 :(得分:0)
要回溯,你只需使用目的地点的父亲,然后继续直到你到达你开始的地方......类似
ArrayList < vertex > points = new ArrayList < > ();
while ((current.x != startx) || (current.y != starty)) {
points.add(current);
current = current.parent;
}
其中startx
和starty
是您在网格中开始的(x,y)位置。您希望在找到要查找的目的地后执行此操作,即在您突破while(!q.isEmpty()){...}
之后。
while (!q.isEmpty()) {
current = q.dequeue();
if (current.x == targetx && current.y == targety) break; //quite when path is found
...
}
ArrayList < vertex > vertices = new ArrayList < > ();
while ((current.x != startx) || (current.y != starty)) {
vertices.add(current);
current = current.parent;
}
所以parent
Point
是一种记住你来自哪里的方式,所以如果你有目的地Point
那么你应该有目的地Point
'{ {1}}(或之前的位置),一旦您有目的地parent
的{{1}},您就想找到目的地Point
的{{1}} parent
依此类推,直到你开始搜索Point
。我也是,只是为了增加您的困惑,在parent
中犯了一个错误,因此我将parent
更改为Point
,因为您不想停止迭代例如,你只有正确的y值,你希望它在双方都是假的时候停止,即while ((current.x != startx)...)
和while ((current.x != startx) && (current.y != starty))
都是假的。