题目描述
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
示例 1:
输入:
[[0,0,0],
[0,1,0],
[0,0,0]]
输出:
[[0,0,0],
[0,1,0],
[0,0,0]]
示例 2:
输入:
[[0,0,0],
[0,1,0],
[1,1,1]]
输出:
[[0,0,0],
[0,1,0],
[1,2,1]]
提示:
给定矩阵的元素个数不超过 10000。
给定矩阵中至少有一个元素是 0。
矩阵中的元素只在四个方向上相邻: 上、下、左、右。
思路
多源bfs
首先咱们的结果矩阵和给定矩阵的大小一样
在给定矩阵中某个位置的值为0,结果矩阵相应的位置也是0;
然后咱们从这些0的位置同时开始向四周走,每次走到以前没走过的位置就更新当前走到的位置为上一步的位置+1
题解
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
if(matrix.empty()||matrix[0].empty()) return matrix;
int n=matrix.size(),m=matrix[0].size();
queue<pair<int,int>> q;
vector<vector<int>> dist(n,vector<int>(m,-1));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(matrix[i][j]==0){
dist[i][j]=0;
q.push({i,j});
}
}
}
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
while(!q.empty()){
pair<int,int> p=q.front();
q.pop();
for(int i=0;i<4;i++){
int x=p.first+dx[i],y=p.second+dy[i];
if(x>=0&&x<n&&y>=0&&y<m){
if(dist[x][y]==-1){
dist[x][y]=dist[p.first][p.second]+1;
q.push({x,y});
}
}
}
}
return dist;
}
};