多源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 。