- 边界着色
给你一个大小为 m x n 的整数矩阵 grid ,表示一个网格。另给你三个整数 row、col 和 color 。网格中的每个值表示该位置处的网格块的颜色。
当两个网格块的颜色相同,而且在四个方向中任意一个方向上相邻时,它们属于同一 连通分量 。
连通分量的边界 是指连通分量中的所有与不在分量中的网格块相邻(四个方向上)的所有网格块,或者在网格的边界上(第一行/列或最后一行/列)的所有网格块。
请你使用指定颜色 color 为所有包含网格块 grid[row][col] 的 连通分量的边界 进行着色,并返回最终的网格 grid 。
示例 1:
输入:grid = [[1,1],[1,2]], row = 0, col = 0, color = 3
输出:[[3,3],[3,2]]
示例 2:
输入:grid = [[1,2,2],[2,3,2]], row = 0, col = 1, color = 3
输出:[[1,3,3],[2,3,3]]
示例 3:
输入:grid = [[1,1,1],[1,1,1],[1,1,1]], row = 1, col = 1, color = 2
输出:[[2,2,2],[2,1,2],[2,2,2]]
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 50
1 <= grid[i][j], color <= 1000
0 <= row < m
0 <= col < n
题解
如果一个节点4个方向上只要有一个不是和该节点一致,就是边界节点。
AC代码
class Solution
{
public:
struct Node
{
int x,y;
};
int mp[55][55];
bool vis[55][55];
queue<Node>q;
int xx[4]={0,0,-1,1};
int yy[4]={-1,1,0,0};
bool check(int x,int y)//判断是不是边缘
{
int ans = 0;
for(int i=0;i<4;i++)
{
int x2=x+xx[i];
int y2=y+yy[i];
if(mp[x2][y2]==mp[x][y])
ans++;
}
if(ans<4)return true;
return false;
}
void bfs(vector<vector<int>>& grid,int row, int col, int color)
{
memset(vis,0,sizeof(vis));
Node t;
t.x=row+1,t.y=col+1;
q.push(t);
vis[t.x][t.y]=true;
if(check(t.x,t.y))
{
grid[t.x-1][t.y-1]=color;
}
while(!q.empty())
{
t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
Node w;
w.x=t.x+xx[i];
w.y=t.y+yy[i];
if(w.x<=0||w.x>grid.size()||w.y<=0||w.y>grid[0].size())continue;
if(vis[w.x][w.y])continue;
if(mp[w.x][w.y]!=mp[row+1][col+1])continue;
vis[w.x][w.y]=true;
q.push(w);
if(check(w.x,w.y))//是边界点
{
grid[w.x-1][w.y-1]=color;
}
}
}
}
vector<vector<int>> colorBorder(vector<vector<int>>& grid, int row, int col, int color)
{
memset(mp,0,sizeof(mp));
for(int i=0;i<grid.size();i++)
{
for(int j=0;j<grid[i].size();j++)
{
mp[i+1][j+1] = grid[i][j];
}
}
bfs(grid,row,col,color);
return grid;
}
};