leetcode 1162. 地图分析【BFS】

在本题中,海洋与陆地的距离可以等效为对陆地节点进行广度优先搜索,直到遇到海洋节点前所搜索的层数。
找出上述规律后,可用典型的队列实现对陆地节点的BFS了。不过这里有几点需要注意:

  1. 搜索的第一层应当是所有陆地节点,即对所有陆地节点同时展开搜索,这样最后一个被放入队列的节点就是距离陆地最远的海洋节点;
  2. 队列中存放的是海洋节点的坐标;
  3. 定义一个dir数组来简化对一个陆地节点的搜索;
  4. 将海洋节点放入队列前,将其数值改为2,这样海洋节点不会被重复放入队列。
class Solution {

    int[][] dir = {{1,0},{-1,0},{0,1},{0,-1}};

    public int maxDistance(int[][] grid) {
        int n = grid.length;
        Queue<int[]> q = new LinkedList<>();


        for(int i=0; i<n;i++){
            for(int j=0; j<n; j++){
                if(grid[i][j] == 1)q.offer(new int[]{i, j});
            }
        }

        if(q.size()==0 || q.size() == n*n){
            return -1;
        }

        int res=-1;
        while(!q.isEmpty()){
            res++;
            int len = q.size();
            for(int i=0; i<len; i++){
                int[] e = q.poll();
                int x = e[0];
                int y = e[1];

                for(int j=0; j<4; j++){
                    int newX = x + dir[j][0];
                    int newY = y + dir[j][1];
                    if(newX>=0 && newX <n && newY >=0 && newY <n && grid[newX][newY]==0){
                        grid[newX][newY] = 2;
                        q.offer(new int[]{newX, newY});
                    }
                }
            }
        }
        return res;
    }
}
发布了55 篇原创文章 · 获赞 0 · 访问量 767

猜你喜欢

转载自blog.csdn.net/er_ving/article/details/105174072