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,所以自然避免了重复访问。

相关推荐
彷徨而立3 分钟前
【C/C++】多线程读写普通 int 变量的一些问题(二)
c语言·c++
一只旭宝6 分钟前
五种线程池设计
c++·笔记
luj_176810 分钟前
毒素驱动的生物自毁机制探析
服务器·c语言·开发语言·经验分享·算法
某林21213 分钟前
机器人收不住、转不动?执行器死区的原理与三层补偿设计
前端·网络·c++·架构·机器人
一水鉴天23 分钟前
问题分类的三元组映射体系与求解方法论 20260901(千问)
人工智能·算法·机器学习
breeze jiang25 分钟前
LangChain Memory 实战:用 InMemoryChatMessageHistory 管理多轮对话
前端·算法·langchain
程与留14 小时前
15_国际化和本地化:tr()、ts 文件、QM 文件、多语言切换
c++·qt
地平线开发者15 小时前
【模型轻量化专题】衡量模型轻量性的指标
算法
程与留16 小时前
14_Qt 样式表(QSS)入门(语法、选择器、美化实战)
c++·qt
学习星球19 小时前
OFDM技术精讲:正交性推导、循环前缀原理与80行Python链路仿真(附实测数据)
算法·面试·前端框架