题目描述
有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。
你也被给予三个整数 sr , sc 和 newColor 。你应该从像素 image[sr][sc] 开始对图像进行 上色填充 。
为了完成 上色工作 ,从初始像素开始,记录初始坐标的 上下左右四个方向上 像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应 四个方向上 像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为 newColor 。
最后返回 经过上色渲染后的图像 。
输入与输出
输入: image = [[1,1,1],[1,1,0],[1,0,1]],sr = 1, sc = 1, newColor = 2
输出: [[2,2,2],[2,2,0],[2,0,1]]
提示
- m == image.length
- n == image[i].length
- 1 <= m, n <= 50
- 0 <= image[i][j], newColor < 216
- 0 <= sr < m
- 0 <= sc < n
思路
题意就是找以[sr][sc]为起点的连通块,将其值变成newColor。用bfs来做即可。
AC代码
class Solution {
public:
int dir[4][2] = {{1, 0}, {0, 1}, {0, -1}, {-1, 0}};
int vis[50][50];
typedef pair<int, int> pii;
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {
queue<pii> q;
int val = image[sr][sc];
int n = image.size();
int m = image[0].size();
q.push(pii(sr, sc));
while(!q.empty()) {
pii cur = q.front(); q.pop();
int cx = cur.first, cy = cur.second;
image[cx][cy] = color;
vis[cx][cy] = 1;
for (int i = 0; i < 4; ++i) {
int dx = cx + dir[i][0];
int dy = cy + dir[i][1];
if (dx < 0 || dx >= n || dy < 0 || dy >= m || image[dx][dy] != val || vis[dx][dy] == 1) continue;
q.push(pii(dx, dy));
}
}
return image;
}
};