bfs迷宫并不只显示最短路径

r6l8ljro  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(473)

我目前正在做一个小的迷宫求解项目,在这个项目中,你可以在迷宫中找到最短路径,以便更好地理解路径搜索算法,比如在这个例子中的广度优先搜索算法。我的实现使用一个布尔访问矩阵来标记访问过的单元格,以避免重复步骤,然后在下面的步骤中工作。
第1步-使用访问队列保留相邻的单元格。
步骤2-删除队列前面的单元格并将其添加到访问列表中,递增步骤变量。
第3步-检查相邻的单元,如果它们不是墙,也没有被访问,它们将被添加到访问队列中。
步骤4-重复步骤2和步骤3,直到整个队列为空。
广度优先搜索的实现工作,它把路径(即0)变成访问路径(即2),但我有一个问题,我不能让它减少距离(变量)的目标和改变死胡同回0,使它只显示最短的路径和最短的步骤需要达到它?也许一些新的眼睛会看到我错过了什么。提前谢谢!
结果是这样的:

而不是这样:

bfs迷宫求解器实现

import java.util.LinkedList;
import java.util.Queue;

public class BFS {

    private static int distance = 0;

    // Solves given maze iteratively, input starting position in maze and size of the maze.
    public static boolean solve(int[][] maze, int x, int y, int sizeX, int sizeY) {

        boolean[][] visited = new boolean[sizeX][sizeY];
        Queue<Point> vQueue = new LinkedList<Point>();
        vQueue.add(new Point(x, y, null));

        while (!vQueue.isEmpty()) {
            distance++;
            Point p = vQueue.remove();
            visited[p.x][p.y] = true;

            // 3 is the cell the algorithm is supposed to find.
            if (maze[p.x][p.y] == 3) {
                maze[p.x][p.y] = 2;
                System.out.println("Shortest path has "+ distance + " steps.");
                return true;
            }

            maze[p.x][p.y] = 2;
            // Down.
            if (visited[p.x-1][p.y] == false && (maze[p.x-1][p.y] == 0 || maze[p.x-1][p.y] == 3)) {
                Point nextPoint = new Point(p.x-1, p.y, p);
                vQueue.add(nextPoint);
            }

            // Up.
            if (visited[p.x+1][p.y] == false  && (maze[p.x+1][p.y] == 0 || maze[p.x+1][p.y] == 3)) {
                Point nextPoint = new Point(p.x+1, p.y, p);
                vQueue.add(nextPoint);
            }

            // Right.
            if (visited[p.x][p.y+1] == false  && (maze[p.x][p.y+1] == 0 || maze[p.x][p.y+1] == 3)) {
                Point nextPoint = new Point(p.x, p.y+1, p);
                vQueue.add(nextPoint);
            }

            // Left.
            if (visited[p.x][y-1] == false  && (maze[p.x][p.y-1] == 0 || maze[p.x][p.y-1] == 3)) {
                Point nextPoint = new Point(p.x, p.y-1, p);
                vQueue.add(nextPoint);
            }
        }

        return false;
    }

    // Node class that holds current position and visitation list.
    private static class Point{
        int x;
        int y;
        Point parent;

        public Point(int x, int y, Point parent) {
            this.x = x;
            this.y = y;
            this.parent = parent;
        }

    }

}

测试迷宫

public class TestMazeDFS {
    private static int[][] maze = {
            {1, 1, 1, 1, 1, 1, 1, 1, 1},        
            {1, 0, 0, 0, 0, 0, 0, 0, 1},
            {1, 0, 1, 0, 1, 1, 1, 1, 1},
            {1, 0, 1, 0, 0, 0, 0, 0, 1},
            {1, 1, 1, 1, 1, 0, 1, 0, 1},
            {1, 0, 0, 0, 1, 0, 1, 0, 1},
            {1, 0, 1, 1, 1, 1, 1, 0, 1},
            {1, 0, 0, 0, 0, 0, 0 ,3, 1},
            {1, 1, 1, 1, 1, 1, 1, 1, 1},
        };

    public int[][] getMaze(){

        return this.maze;
    }

    // prints the maze.
    public static void printMaze() {
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
//              if (maze[i][j] == 1) {
//                  System.out.print('#');
//              } else {
//                  System.out.print(' ');
//              }
                System.out.print(maze[i][j]);
            }
            System.out.println();
        }
        System.out.println();
    }

    public static void main(String[] args) {
        TestMazeDFS maze = new TestMazeDFS();
        boolean test = BFS.solve(maze.getMaze(), 1, 1, 9, 9);
        System.out.println(test);
        printMaze();

    }
}
ohfgkhjo

ohfgkhjo1#

我不知道你怎么想输出最短路径。但另一种方法是使用整数矩阵,而不是布尔矩阵。然后在每个单元格中记录距离起点有多远。
也就是说,在处理一个点时,从整数矩阵中读取到起点的当前距离。然后确定其单元格中距离仍为0的所有有效邻居,将当前距离+1写入这些单元格,并将它们添加到队列中。
最后,您可以通过从目标开始回溯,沿着每一步减少1的路径找到最短路径。

相关问题