BFS解决FloodFill算法_图像渲染_C++

BFS解决FloodFill算法_图像渲染_C++


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. 用变化量搜索四个方向:

在这里插入图片描述

  • 假设要遍历图中红点的四个方向上的不同点,我们可以设计两个方向向量dxdy
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,养成习惯,这是层序遍历的模版。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-指短琴长-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值