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

相关推荐
rannn_1115 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
数模竞赛Paid answer6 小时前
2026年华东杯数学建模B题医药物流安排问题解题全过程文档及程序
算法·数学建模·数据分析·华东杯
不会代码的小猴6 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
青瓦梦滋7 小时前
传输层UDP/TCP协议
linux·网络·c++·网络协议·tcp/ip·udp
AI备案指南-满满7 小时前
大模型与算法备案全流程详解:从零到通过的完整指南
人工智能·算法·备案·大模型备案·算法备案
江畔柳前堤7 小时前
LLM 训练核心机制深度解析:Warmup、Cosine Decay 与 Perplexity 的完整知识体系
网络·人工智能·深度学习·算法·机器学习·语音识别
一只旭宝7 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
良木林7 小时前
子串 - LeetCode hot 100
算法·leetcode·职场和发展
陌诺曦.8 小时前
Python扩展小练习
算法