LeetCode 733.图像渲染 - C++ - 小结

图像渲染

有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。
给你一个坐标(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]]
解析:
在图像的正中间,(坐标(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]内。

个人理解
从像素位置开始上色,渲染周边和目标像素初始颜色相同的像素。
算法:将 color 置为目标像素初始颜色。从目标像素位置开始上色:如果像素颜色和 color 相同则改变像素颜色为 newColor,然后再从四个方向进行上色,重复上述过程。使用 dfs 函数对目标像素进行渲染。

代码如下(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);   // 深度优先搜索
    }
    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);
  }
};

看到一个解法,作者:OrangeMan,简洁易懂,优秀。

class Solution {
public:
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
        int oldColor = image[sr][sc];   //记录旧坐标的像素
        if (image[sr][sc] == newColor) return image; //颜色相同则无需修改
        image[sr][sc] = newColor;   //染色
        int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}; //上右下左
        for (int i = 0; i < 4; i ++) {
            int x = sr + dx[i], y = sc + dy[i];
            if (x >=0 && y >= 0 && x < image.size() && y < image[0].size() && image[x][y] == oldColor)
                floodFill (image, x, y, newColor);
        }
        return image;
    }
};

放在最后

如果您喜欢我的文章,拜托点赞+收藏+关注,博主会根据大家喜好来推出相关系列文章~

更多精彩内容也可以访问我的博客Aelous-BLog

猜你喜欢

转载自blog.csdn.net/Aelous_dp/article/details/107855684