gpt4 book ai didi

Java-迷宫广度优先搜索最短路径

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:09:06 25 4
gpt4 key购买 nike

我似乎无法理解如何检索由我正在实现的广度优先搜索算法发现的最短路径。目前该算法可以工作,因为它可以找到迷宫的导出(如果可以到达)。在另一篇文章中,有人提到在节点被标记为已访问后保持对父节点的跟踪。我尝试了一个简单的实现,试图通过在 Point 结构中包含一个父 Point 来跟踪父节点,但是当我在 Grid 上标记路径时,它标记了它迄今为止走过的所有路径,我相信我可能搞砸了以某种方式跟踪 parent 。

任何人都知道我哪里出错了。也许我错过了一些简单的东西?该准则包含在下面作为引用。

迷宫是一个二维整数网格。假设1是一堵墙,0是一条可移动的路径。

点类包含:点父整数 x, y;仅此而已。

public Point BFS(int x, int y){
Queue<Point> Path = new Queue<>();

Path.enqueue(new Point(x,y));//push current on queue

Point Cur = Path.front();//make current point
//test code for recursive backcall of path
Cur.setParent(null);
//test code for recursive backcall of path


Point end = new Point(mWidth-2, mHeight-2);//set goal

while((!Path.isEmpty())){
Point old = Cur;

Cur = Path.dequeue();
Cur.setParent(old);

if(Cur.compareto(end)){
return Cur;//return Point then traverse up from here calling Cur.Parent to get path.
}
else if(Maze[Cur.getX()][Cur.getY()]==1){//Enque all possible paths

Maze[Cur.getX()][Cur.getY()] = 2;//mark as visitied
if(Cur.getX()-1>=0)
if(Maze[Cur.getX()-1][Cur.getY()]==1)
Path.enqueue(new Point(Cur.getX()-1,Cur.getY()));

if(Cur.getX()+1<mWidth)
if(Maze[Cur.getX()+1][Cur.getY()]==1)
Path.enqueue(new Point(Cur.getX()+1,Cur.getY()));

if(Cur.getY()-1>=0)
if(Maze[Cur.getX()][Cur.getY()-1]==1)
Path.enqueue(new Point(Cur.getX(),Cur.getY()-1));

if(Cur.getY()+1<mHeight)
if(Maze[Cur.getX()][Cur.getY()+1]==1)
Path.enqueue(new Point(Cur.getX(),Cur.getY()+1));
}

}
return null;
}

最佳答案

看起来 old 经过多次迭代后不再是父级。您可以在将点添加到队列时设置父节点,例如:

Point next = new Point(Cur.getX()-1,Cur.getY());
next.setParent(Cur);
Path.enqueue(next);

然后,当您找到结尾时,您应该能够通过调用 getParent() 直到它为 null 将路径返回到开头。

关于Java-迷宫广度优先搜索最短路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16679528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com