1926. 迷宫中离入口最近的出口

题目:

思路:

【1】利用广度搜索,相当于向四个方向各自分一个分身去走,碰到障碍物则该分身消失,然后每个分身到了下个位置再次分出四个走下一个位置,这样每一层的分身的步数其实是一致的,当有一个分身到了边界,那么这个位置就是最短的路径的出口。

代码展示:

//时间5 ms 击败 61.7%
//内存44.2 MB 击败 5.13%
class Solution {
    class Point {
        // 横坐标
        int x;
        // 纵坐标
        int y;
        // 步数
        int step;

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

    public int nearestExit(char[][] maze, int[] entrance) {
        return bfs(maze, entrance[0], entrance[1]);
    }

    public int bfs(char[][] maze, int i, int j) {
        //可以移动的方向
        int[] dx = {1, -1, 0, 0};
        int[] dy = {0, 0, 1, -1};
        int m = maze.length;
        int n = maze[0].length;
        Queue<Point> queue = new LinkedList<>();

        //入口入队
        queue.offer(new Point(i, j, 0));

        //标记为已访问过
        maze[i][j] = '+';
        while (!queue.isEmpty()) {
            Point poll = queue.poll();
            //不是入口,且是边界
            if (!(poll.x == i && poll.y == j) && (poll.x == 0 || poll.x == m - 1 || poll.y == 0 || poll.y == n - 1)) {
                return poll.step;
            }

            //枚举四个方向
            for (int k = 0; k < dx.length; k++) {
                int x = poll.x + dx[k];
                int y = poll.y + dy[k];

                //没越界且未访问过
                if (x >= 0 && x < m && y >= 0 && y < n && maze[x][y] == '.') {
                    queue.offer(new Point(x, y, poll.step + 1));
                    //标记为已访问过
                    maze[x][y] = '+';
                }
            }
        }
        //程序运行到这里,说明不存在这样的路径,返回 -1
        return -1;
    }
}

 

posted @ 2023-08-01 11:24  忧愁的chafry  阅读(26)  评论(0编辑  收藏  举报