leetcode1162. 地图分析(bfs)

你现在手里有一份大小为 N x N 的「地图」(网格) grid,上面的每个「区域」(单元格)都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,请你找出一个海洋区域,这个海洋区域到离它最近的陆地区域的距离是最大的。

我们这里说的距离是「曼哈顿距离」( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个区域之间的距离是 |x0 - x1| + |y0 - y1| 。

如果我们的地图上只有陆地或者海洋,请返回 -1。
输入:[[1,0,1],[0,0,0],[1,0,1]]
输出:2
解释:
海洋区域 (1, 1) 和所有陆地区域之间的距离都达到最大,最大距离为 2。

代码

class Solution {
    public int maxDistance(int[][] grid) {
        Queue<int[]> queue=new LinkedList<>();
        int[][] dir=new int[][]{{-1,0},{1,0},{0,1},{0,-1}};
        for(int i=0;i<grid.length;i++)
            for(int j=0;j<grid[0].length;j++)
                if(grid[i][j]==1)
                {
                    queue.offer(new int[]{i,j});
                }    
        if(queue.size()==0||queue.size()==grid[0].length*grid.length) return -1;
        //全为陆地或海洋
        int res=0;
        while (!queue.isEmpty())//bfs
        {
            int size=queue.size();
            for(int i=0;i<size;i++)//按层扩散进去
            {
                int[] e=queue.poll();
                int ex=e[0],ey=e[1];
                for(int[] d:dir)
                {
                    int nextX=ex+d[0],nextY=ey+d[1];
                    if(nextX<0||nextX>=grid.length||nextY<0||nextY>=grid[0].length||grid[nextX][nextY]==1)
                        continue;
                    grid[nextX][nextY]=1;//访问过的标记为陆地
                    queue.offer(new int[]{nextX,nextY});
                }

            }

            res++;//记录需要扩散的层数
        }
        return res-1;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44560620/article/details/107630688
今日推荐