733.图像渲染 (Easy)*
题目描述*
有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。
给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newColor,让你重新上色这幅图像。
为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。
最后返回经过上色渲染后的图像。
注意*
image 和 image[0] 的长度在范围 [1, 50] 内。
给出的初始点将满足 0 <= sr < image.length 和 0 <= sc < image[0].length。
image[i][j] 和 newColor 表示的颜色值在范围 [0, 65535]内
代码*
跟之前的 腐烂的橘子 差不多,这个更简单,给了起点。简单的 dfs 和 bfs。
class Solution {
public:
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
int oldColor = image[sr][sc];
if(newColor == oldColor) {
return image;
}
dfs(image, sr, sc, newColor, oldColor);
return image;
}
void dfs(vector<vector<int>>& image, int i, int j, int newColor, int oldColor) {
if(i < 0 || j < 0 || i >= image.size() || j >= image[0].size() || image[i][j] != oldColor) {
return;
}
image[i][j] = newColor;
dfs(image, i + 1, j, newColor, oldColor);
dfs(image, i - 1, j, newColor, oldColor);
dfs(image, i, j - 1, newColor, oldColor);
dfs(image, i, j + 1, newColor, oldColor);
}
};
class Solution {
public:
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
int oldColor = image[sr][sc];
if(newColor == oldColor) {
return image;
}
bfs(image, sr, sc, newColor, oldColor);
return image;
}
void bfs(vector<vector<int>>& image, int i, int j, int newColor, int oldColor) {
queue<pair<int, int>> q;
q.push({i, j});
image[i][j] = newColor;
while(!q.empty()) {
int x = q.front().first, y = q.front().second;
q.pop();
if(x != 0 && image[x - 1][y] == oldColor) {
image[x - 1][y] = newColor;
q.push({x - 1, y});
}
if(x < image.size() - 1 && image[x + 1][y] == oldColor) {
image[x + 1][y] = newColor;
q.push({x + 1, y});
}
if(y != 0 && image[x][y - 1] == oldColor) {
image[x][y - 1] = newColor;
q.push({x, y - 1});
}
if(y < image[0].size() - 1 && image[x][y + 1] == oldColor) {
image[x][y + 1] = newColor;
q.push({x, y + 1});
}
}
}
};
最后更新: July 23, 2022