有一幅以 m * n 的二维整数数组表示的图画 image
,其中 image[i][j]
表示该图画的像素值大小。你也被给予三个整数 sr
, sc
和 newColor
。你应该从像素 image[sr][sc]
开始对图像进行 上色填充 。为了完成 上色工作 ,从初始像素开始,记录初始坐标的 上下左右四个方向上 像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应 四个方向上 像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为 newColor
。最后返回 经过上色渲染后的图像 。
函数的实现原理是使用广度优先搜索(BFS)算法。首先,将起始位置(sr, sc)
加入队列q
中。然后,遍历队列中的每个位置,将其填充为color
,并将其周围的四个位置加入队列中,条件是它们在图像范围内且与起始位置的像素值相同。重复这个过程,直到队列为空。
注意:
- 函数的输入参数
image
是一个二维数组,表示图像。数组中的每个元素表示图像中的一个像素的颜色。 - 函数的返回值是一个二维数组,表示填充后的图像。
- 函数使用了四个方向向量
px
和py
来表示四个方向的移动。 - 函数使用了
pair<int, int>
类型来表示队列中的每个位置。
class Solution {
public:
int px[4] = {0, 0, 1, -1};
int py[4] = {1, -1, 0, 0};
typedef pair<int, int> PII;
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc,
int color) {
if (image[sr][sc] == color) return image;
queue<PII> q;
int prevcol = image[sr][sc];
q.push({sr, sc});
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
image[x][y] = color;
for (int i = 0; i < 4; i++) {
if (x + px[i] >= 0 && y + py[i] >= 0 &&
x + px[i] < image.size() && y + py[i] < image[0].size() &&
image[x + px[i]][y + py[i]] == prevcol) {
q.push({x + px[i], y + py[i]});
}
}
}
return image;
}
};