FloodFill(图像渲染)(1)

一.题目

733. 图像渲染 - 力扣(LeetCode)

二.思路讲解

2.1 审题

本题要求从给定的起始像素 (sr, sc) 出发,将其颜色 改为新颜色 color,然后递归地 将与其四方向相邻颜色相同 的像素也改为新颜色,直到所有相连的同色区域都被填充。这本质上是一个连通区域填充问题。

2.2 思路讲解

由于起点和填充规则已经明确,我们只需采用深度优先搜索(DFS) 或来遍历所有与起点相连且颜色相同的格子。从起点开始,将其颜色改为 color,然后向上下左右四个方向探索,如果相邻格子在边界内未被访问过 、且颜色与原始颜色相同 ,则递归地执行相同操作。注意剪枝:若新颜色与原始颜色相同,则无需操作,直接返回原图,不然递归会死循环!

三.代码演示

cpp 复制代码
class Solution {
public:
    int new_color;
    int dx[4] = {0,0,1,-1};
    int dy[4] = {1,-1,0,0};
    int row,col;
    int target;
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color)
    {
        //避免要改的和自己本来的值相同
        if(color == image[sr][sc])
            return image;

        //初始化
        target = image[sr][sc];//获得和它相同的值
        row = image.size(),col = image[0].size();
        new_color = color;
        

        dfs(image,sr,sc);
        return image;
    }
    void dfs(vector<vector<int>>& image,int i,int j)
    {
        image[i][j] = new_color;//变化它为新color
        for(int k = 0;k < 4;k++)
        {
            int x = i + dx[k],y = j + dy[k];
            if(x >= 0 && y >= 0 && x < row && y < col && image[x][y] == target)
            {
                dfs(image,x,y);
            }
        }
    }

};

四.代码讲解

一、全局变量与数据结构
  • new_color:整型变量,存储目标新颜色。

  • target:整型变量,存储原始起点的颜色,用于判断相邻格子是否属于同一连通区域。

  • rowcol:成员变量,存储图像的行数和列数。

  • 方向数组 dx[4]dy[4]:表示上下左右四个方向的偏移量,方便探索相邻像素。

二、主函数 floodFill
  1. 首先判断如果新颜色 color 等于起点像素的原始颜色,则无需填充,直接返回原图。

  2. 否则,记录起点原始颜色到 target,获取图像尺寸到 rowcol,保存新颜色到 new_color

  3. 调用递归函数 dfs,从起点 (sr, sc) 开始进行深度优先搜索。

  4. 最后返回修改后的图像 image

三、递归函数 dfs

dfs(image, i, j) 表示将当前像素 (i, j) 的颜色改为新颜色,并继续向其四周扩散。执行流程如下:

1. 修改当前像素颜色

image[i][j] 设为 new_color,表示该像素已被填充。

2. 向四个方向探索

使用 for 循环遍历四个方向,计算新坐标 (x, y)。对于每个方向,检查该相邻像素是否合法:

  • 边界检查x >= 0 && y >= 0 && x < row && y < col

  • 颜色匹配image[x][y] == target,即与起点原始颜色相同。

如果满足条件,则递归调用 dfs(image, x, y),继续填充该相邻像素。

四、关键细节
  • 提前返回:当新颜色与起点原始颜色相同时,无需任何操作,直接返回原图,避免死循环和无效递归。

  • 无需访问标记数组 :因为每次填充后颜色被修改为新颜色,不再等于 target,所以自然避免了重复访问。

相关推荐
程序员AlbertTu20 小时前
# Mantissa 使用教程 — Python 版与 C++ 版
c++·python·数值运算
Lazionr20 小时前
多态:从多种形态到运行时绑定
开发语言·c++
tryxr20 小时前
矩阵的几种基础变换
java·数据结构·算法·矩阵
mmmmath_320 小时前
LeetCode.028.找出字符串中第一个匹配项的
数据结构·算法·leetcode
别动我齐刘海20 小时前
ROS2 Jazzy + C++ 实战路线——ros2_control
c++·人工智能·python·opencv·机器学习·机器人·github
金融小师妹20 小时前
AI金融能力评估:18个主流模型金融问题平均错误率达57%
人工智能·云计算·逻辑回归·深度优先
Selvaggia20 小时前
DMD(Distribution Matching Distillation,分布匹配蒸馏)
算法
Navigator_Z21 小时前
LeetCode //C - 1255. Maximum Score Words Formed by Letters
c语言·算法·leetcode
All for pursuit.21 小时前
【栈-4】739.每日温度
数据结构·c++·算法·leetcode
码匠许师傅21 小时前
【C++三方组件】glog:Google 出品的 C++ 日志库
c++