1. 题目解析
Leetcode链接:https://leetcode.cn/problems/flood-fill/description/
对指定区域进行涂色,将上下左右四个方向上,相邻的颜色相同的区域,涂色成指定的颜色color
。
示例:
输入:
image = [[1,1,1],[1,1,0],[1,0,1]],sr = 1, sc = 1, color = 2
输出:
[[2,2,2],[2,2,0],[2,0,1]]
解释:
- 在图像的正中间,坐标
(sr,sc)=(1,1)
(即红色像素),在路径上所有符合条件的像素点的颜色都被更改成相同的新颜色(即蓝色像素)。 - 注意,右下角的像素没有更改为2,因为它不是在上下左右四个方向上与初始点相连的像素点。
2. 算法原理
1. 广度优先遍历:
- 本题可以采用深度优先,也可以采用广度优先,此处我们选用广度优先解题。
- 广度优先搜索,可以看作是一种层序遍历,使用到的数据结构为队列
queue
。
2. 用变化量搜索四个方向:
- 假设要遍历图中红点的四个方向上的不同点,我们可以设计两个方向向量
dx
,dy
。
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
- 只需要使用一个
for
循环,配合这两个方向向量,就可以遍历红点的四个方向了。大家要熟悉这种写法,把它当做是一个解题模版来使用。
3. 代码实现
class Solution {
typedef pair<int, int> PII;
// 变化量
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
public:
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color)
{
int prev = image[sr][sc]; // 先标记需要修改的像素值
if (prev == color) return image; // 如果颜色相同就不需要修改了,处理边界情况
int m = image.size(), n = image[0].size();
queue<PII> q;
q.push({sr, sc});
while(q.size())
{
auto [a, b] = q.front();
q.pop(); // 紧跟pop
image[a][b] = color;
// 遍历上下左右四个方向
for(int i = 0; i < 4; i++)
{
int x = a + dx[i], y = b + dy[i];
if(x >= 0 && x < m && y >= 0 && y < n && image[x][y] == prev)
{
q.push({x, y});
}
}
}
return image;
}
};
细节:
- 取出队头元素后,紧跟
pop
,养成习惯,这是层序遍历的模版。