一、问题描述


二、解题思路
可以使用多源bfs的方法来解决这个问题,由于本题需要聚焦到每一个为1的位置。所以,需要定义一个dis向量来记录1到最近的0的距离,所有元素值初始化为-1。解题思路如下:
(1)首先,遍历mat,将matij==0的(i,j)入队,并将disij由-1修改为0,表示其到最近的0的距离为0;
(2)接下来进行bfs。将队头元素弹出,遍历其四周,如果坐标不越界且disnext_xnext_y==-1,即该位置为1且未被辐射到,就将其dis值修改为discur_xcur_y+1。
辐射完后,返回dis,即为所求。
三、代码实现
cpp
class Solution {
int N,M;
vector<vector<int>> dis;
int dx[4]={0,1,0,-1};
int dy[4]={-1,0,1,0};
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {
//多源bfs(以0为中心进行扩散)
//全局变量初始化
N=mat.size();M=mat[0].size();
dis.resize(N,vector(M,-1));
//遍历mat将0入队并更新其dis
queue<pair<int,int>> q;
for(int i=0;i!=N;i++)
for(int j=0;j!=M;j++)
if(mat[i][j]==0){
q.push({i,j});
dis[i][j]=0;
}
//bfs
while(!q.empty()){
pair<int,int> cur=q.front();q.pop();
int cur_x=cur.first;
int cur_y=cur.second;
for(int i=0;i!=4;i++){
int next_x=cur_x+dx[i];
int next_y=cur_y+dy[i];
if(next_x>=0&&next_x<N&&next_y>=0&&next_y<M&&dis[next_x][next_y]==-1){
q.push({next_x,next_y});
dis[next_x][next_y]=dis[cur_x][cur_y]+1;
}
}
}
return dis;
}
};