【问题标题】:Java- Maze Breadth First Search Shortest PathJava-迷宫广度优先搜索最短路径
【发布时间】:2013-05-21 21:09:47
【问题描述】:

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

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

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

Point 类包含: 点父 整数 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;
}

【问题讨论】:

    标签: java path-finding breadth-first-search


    【解决方案1】:

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

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

    然后当你找到终点时,你应该能够通过调用 getParent() 直到它是 null 来让路径回到起点。

    【讨论】:

    • 谢谢。我知道我哪里出错了。非常感激。它奏效了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    相关资源
    最近更新 更多