一.题目

二.思路讲解
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
-
首先判断如果新颜色
color等于起点像素的原始颜色,则无需填充,直接返回原图。 -
否则,记录起点原始颜色到
target,获取图像尺寸到row和col,保存新颜色到new_color。 -
调用递归函数
dfs,从起点(sr, sc)开始进行深度优先搜索。 -
最后返回修改后的图像
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,所以自然避免了重复访问。