BFS:FloodFill算法

06-21 1591阅读

文章目录

  • FloodFill算法简介
  • 1.图像渲染
  • 2.岛屿数量
  • 3.岛屿的最大面积
  • 4.被围绕的区域
  • 总结

    BFS:FloodFill算法

    FloodFill算法简介

    Flood Fill算法是一种用于确定与某个给定节点相连的区域的算法,常用于计算机图形学和图像处理。该算法可以用于诸如填充多边形、检测连通区域等任务。Flood Fill算法有多种实现方式,其中最常见的是递归方法和使用栈或队列的迭代方法。

    基本思想

    Flood Fill算法从一个初始像素开始,检查该像素的颜色。如果颜色匹配(即需要填充的颜色),则将其填充为新的颜色,然后对相邻的像素重复这一过程,直到所有相连的匹配像素都被填充为止。

    BFS:FloodFill算法

    FloodFill算法也叫洪水灌溉法,上图中0表示岛屿,1表示海洋,如果要我们求岛屿的个数的话就可以用洪水灌溉法则。

    BFS:FloodFill算法

    灌溉之后就像上面一样。

    接下来,我们来练习几道题熟悉一下FloodFill算法。

    1.图像渲染

    题目链接

    题目:

    BFS:FloodFill算法

    样例输入和输出:

    BFS:FloodFill算法

    这道题的意思很简单,就是我们固定一个位置,这个位置的坐标是[sr,sc]这个位置周围的和这个这个区块数字相同数都会被变成新的数字。

    以上面这个例子为例,初始坐标是中间坐标,那么渲染的区块就是:

    BFS:FloodFill算法

    BFS:FloodFill算法

    如果利用FloodFill算法的话,我们按顺序灌溉应该是1->2->3->4。

    算法原理:

    利用BFS的FloodFill算法,这个算法我们只需要借助队列,每次入队列的时候改变当前节点的值。

    代码展示:

    class Solution {
    public:
        typedef pair PIL;
        //定义一个方向数组,上下左右四个位置
        int dx[4]={0,0,1,-1};
        int dy[4]={1,-1,0,0};
        vector floodFill(vector& image, int sr, int sc, int color) 
        {
            //标记一下需要修改的像素值
            int prev=image[sr][sc];
            int m=image.size();
            int n=image[0].size();
            if(prev==color)
            {
                return image;//处理边界情况
            }
            queue q;
            q.push({sr,sc});
            while(q.size())
            {
                auto [a,b]=q.front();
                q.pop();
                image[a][b]=color;
                for(int i=0;i
                    int x=a+dx[i];
                    int y=b+dy[i];
                    if(x=0&&x=0&&y
                        q.push({x,y});
                    }
                }
            }
            return image;
        }
    };
    
    public:
        typedef pair0,0,1,-1};
        int dy[4]={1,-1,0,0};
        bool vis[301][301];
        int ret=0;
        int m,n;
        void bfs(vector
            queuei,j});
            vis[i][j]=false;
            while(q.size())
            {
                auto [a,b]=q.front();
                q.pop();
                for(int k=0;k
                    int x=a+dx[k];
                    int y=b+dy[k];
                    if(x 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]