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:整型变量,存储原始起点的颜色,用于判断相邻格子是否属于同一连通区域。

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

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

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

  2. 否则,记录起点原始颜色到 target,获取图像尺寸到 row 和 col,保存新颜色到 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,所以自然避免了重复访问。

相关推荐
|_⊙4 小时前
C++ 类和对象零散知识点
开发语言·c++
wuyk5554 小时前
27.LeetCode 2265. 统计值等于子树平均值的节点数 —— 后序遍历实战
stm32·单片机·嵌入式硬件·算法
xiangyun614 小时前
C++ list 模拟实现(二):const迭代器与反向迭代器,模板的黑魔法
开发语言·数据库·c++·算法·stl·list
xxwl5854 小时前
三、区域赛算法模版第三章---字符串相关算法
笔记·学习·算法
信奥卷王4 小时前
[GESP202509 六级] 划分字符串(含视频)
数据结构·算法
酒醉的胡铁5 小时前
相似度搜索的常见算法
算法·ai
局部有解5 小时前
Leetcode Hot100 - 最长连续序列
算法·leetcode·职场和发展
行者全栈架构师5 小时前
给开源 Rust 工具加一个新检查项,TRAE 帮我从想法跑到构建产物:全链路实战
前端·算法·架构
坤坤子吖5 小时前
Linux 进程信号入门——从 Ctrl+C 到 kill
linux·开发语言·c++·笔记·学习
行者全栈架构师5 小时前
【鸿蒙心迹】冷启动从 2.8s 优化到 0.9s——耗时拆解与数据对比实战(HarmonyOS 7.x)
前端·算法·架构