多源BFS

2020-04-13  本文已影响0人  rensgf

1162. 地图分析
你现在手里有一份大小为 N x N 的『地图』(网格)grid,上面的每个『区域』(单元格)都用0和1标记好了。其中0代表海洋,1代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗?请返回该海洋区域到离它最近的陆地区域的距离。
我们这里说的距离是『曼哈顿距离』( Manhattan Distance):(x0, y0)和(x1, y1)这两个区域之间的距离是|x0 - x1| + |y0 - y1|。
如果我们的地图上只有陆地或者海洋,请返回-1。
示例 1:
输入:[[1,0,1],[0,0,0],[1,0,1]]输出:2解释: 海洋区域 (1, 1) 和所有陆地区域之间的距离都达到最大,最大距离为 2。
示例 2:
输入:[[1,0,0],[0,0,0],[0,0,0]]输出:4解释: 海洋区域 (2, 2) 和所有陆地区域之间的距离都达到最大,最大距离为 4。
提示:
1 <= grid.length == grid[0].length <= 100
grid[i][j]不是0就是1

class Solution {
public:
    int maxDistance(vector<vector<int>>& grid) {
        int flag=0,a,b;
        int n=grid.size();
        queue<pair<int,int>> q;
// 周围四个点

        int x[4]={1,-1,0,0};

        int y[4]={0,0,1,-1};

//先找到陆地,入队

        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(grid[i][j]==1)
                q.push({i,j});
            }
        }
//遍历陆地周围一圈,如果是海洋,则将值变为与陆地的距离,入队,继续遍历它地一圈。最后找到的海洋一定是距离所有陆地最远的,也是最后一个出队的。
        while(!q.empty())
        {
            pair<int,int> temp=q.front();
            q.pop();
            a=temp.first;
            b=temp.second;
            for(int k=0;k<4;k++)
            {
                if(a+x[k]>=n||a+x[k]<0||b+y[k]>=n||b+y[k]<0||grid[a+x[k]][b+y[k]]!=0)
                continue;
                grid[a+x[k]][b+y[k]]=grid[a][b]+1;
                q.push({a+x[k],b+y[k]});
                flag=1;
            }
        }
        if(flag==0||grid.empty())
        return -1;
        return grid[a][b]-1;
    }
};

994. 腐烂的橘子
在给定的网格中,每个单元格可以有以下三个值之一:
值0代表空单元格;
值1代表新鲜橘子;
值2代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。
返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回-1。


542. 01 矩阵
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。

上一篇 下一篇

猜你喜欢

热点阅读