题目描述:
有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。
给你一个坐标 (sr, sc)
表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newColor
,让你重新上色这幅图像。
为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。
最后返回经过上色渲染后的图像。
示例 1:
输入:
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]]
解析:
在图像的正中间,(坐标(sr,sc)=(1,1)),
在路径上所有符合条件的像素点的颜色都被更改成2。
注意,右下角的像素没有更改为2,
因为它不是在上下左右四个方向上与初始点相连的像素点。
注意:
image
和image[0]
的长度在范围[1, 50]
内。- 给出的初始点将满足
0 <= sr < image.length
和0 <= sc < image[0].length
。 image[i][j]
和newColor
表示的颜色值在范围[0, 65535]
内。
解题思路:
C++代码:
class Solution {
public:
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
vector<vector<int>> new_image(image);
int oldColor = image[sr][sc]; // 例子:oldColor = 1
if (oldColor != newColor) { // 新的颜色不同于旧颜色才更新
DFS(new_image, sr, sc, oldColor, newColor); // 多传入一个oldColor,其他位置与旧颜色相同(都是1)才更新
}
return new_image;
}
private:
void DFS(vector<vector<int>> &new_image, int r, int c, int old_color, int new_color) {
int row_num = new_image.size(), col_num = new_image[0].size();
// 越界,或者颜色不相等返回,例子:old_color = 1, 只更新位置color = 1的地方
if (r < 0 || r >= row_num || c < 0 || c >= col_num || new_image[r][c] != old_color) { // 先判断是否越界,不然后面会越界
return;
}
new_image[r][c] = new_color;
DFS(new_image, r - 1, c, old_color, new_color);
DFS(new_image, r + 1, c, old_color, new_color);
DFS(new_image, r, c - 1, old_color, new_color);
DFS(new_image, r, c + 1, old_color, new_color);
}
};