class Solution {
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
typedef pair<int,int> PII;
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {
int m=mat.size(),n=mat[0].size();
vector<vector<int>> ans(m,vector<int>(n,-1));
queue<PII> q;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(mat[i][j]==0)
{
q.push({i,j});
ans[i][j]=0;
}
while(q.size())
{
auto [a,b]=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int x=a+dx[i],y=b+dy[i];
if(x>=0&&x<m&&y>=0&&y<n&&ans[x][y]==-1)
{
ans[x][y]=ans[a][b]+1;
q.push({x,y});
}
}
}
return ans;
}
};
class Solution {
typedef pair<int,int> PII;
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
bool vis[505][505];
public:
int numEnclaves(vector<vector<int>>& grid) {
int m=grid.size(),n=grid[0].size();
queue<PII> q;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(i==0||i==m-1||j==0||j==n-1)
{
if(grid[i][j]==1)
{
q.push({i,j});
vis[i][j]=1;
}
}
while(q.size())
{
auto [a,b]=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int x=a+dx[i],y=b+dy[i];
if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]==1&&!vis[x][y])
{
q.push({x,y});
vis[x][y]=1;
}
}
}
int ans;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(grid[i][j]==1&&!vis[i][j]) ans++;
}
return ans;
}
};
class Solution {
typedef pair<int,int> PII;
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
public:
vector<vector<int>> highestPeak(vector<vector<int>>& isWater) {
int m=isWater.size(),n=isWater[0].size();
vector<vector<int>> hegith(m,vector<int>(n,-1));
queue<PII> q;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(isWater[i][j]==1)
{
q.push({i,j});
hegith[i][j]=0;
}
while(q.size())
{
auto [a,b]=q.front();q.pop();
for(int i=0;i<4;i++)
{
int x=a+dx[i],y=b+dy[i];
if(x>=0&&x<m&&y>=0&&y<n&&hegith[x][y]==-1)
{
q.push({x,y});
hegith[x][y]=hegith[a][b]+1;
}
}
}
return hegith;
}
};
class Solution {
typedef pair<int,int> PII;
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
public:
int maxDistance(vector<vector<int>>& grid) {
int m=grid.size(),n=grid[0].size();
vector<vector<int>> dist(m,vector<int>(n,-1));
queue<PII> q;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(grid[i][j]==1)
{
q.push({i,j});
dist[i][j]=0;
}
int ans=-1;
while(q.size())
{
auto [a,b]=q.front();q.pop();
for(int i=0;i<4;i++)
{
int x=a+dx[i],y=b+dy[i];
if(x>=0&&x<m&&y>=0&&y<n&&dist[x][y]==-1)
{
q.push({x,y});
dist[x][y]=dist[a][b]+1;
ans=max(ans,dist[x][y]);
}
}
}
return ans;
}
};