[优选算法专栏]专题十五:FloodFill算法(一)

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。

💓博主csdn个人主页:小小unicorn
⏩专栏分类:算法从入门到精通
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

专题十五

  • 图像渲染
    • 算法原理:
    • 代码实现:
  • 岛屿数量
    • 算法原理:
    • 代码实现:

图像渲染

题目来源:733.图像渲染

有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。

你也被给予三个整数 sr , sc 和 newColor 。你应该从像素 image[sr][sc] 开始对图像进行 上色填充 。

为了完成 上色工作 ,从初始像素开始,记录初始坐标的 上下左右四个方向上 像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应 四个方向上 像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为 newColor 。

最后返回 经过上色渲染后的图像 。
在这里插入图片描述
在这里插入图片描述

算法原理:

本题要用BFS来解决此问题:
具体如下:
在这里插入图片描述

  1. 从给定位置开始,上下左右搜索为第一层。
  2. 从第一层两个位起点继续上下左右一层一层剥开。
  3. 依次内推…
  4. 当某一层上下左右搜索中,没有发现目标值就结束。

在上面搜索过程中,我们可以边在搜索过程中就进行修改,达到优化效果。

在这里插入图片描述

代码实现:

在代码实现之前,我们先做一下预处理。
通常BFS宽度优先遍历中,要对四个方向或者八个方向进行搜索,此时我们可以定义一个向量数组。
在这里插入图片描述
dx与dy为横坐标与纵坐标的偏移量。我们让坐标加上这个偏移量就是搜索后的宽度优先遍历的四个方向。

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;

        queue<PII> q;
        q.push({sr,sc});

        //获取起始点位置
        int m=image.size(),n=image[0].size();

        while(q.size())
        {
            auto [a,b]=q.front();
            q.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&&y<n&&image[x][y]==prev)
                {
                    //满足情况入队
                    q.push({x,y});
                }
            }
        }
        return image;
    }
};

岛屿数量

题目来源:岛屿数量
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

在这里插入图片描述

算法原理:

题目很好理解:
在这里插入图片描述
看到此类问题,首选BFS。
我们来模拟一下这个过程:
在这里插入图片描述
扫描矩阵,找到一个陆地的时候,就将这个陆地连接的联通快找到。怎么找用BFS。
此时找到一个岛屿,定义一个变量,让我们的ret++即可,但是有个问题:在我们层序遍历扩展到一个位置时,是不能让他拓展回去的。
在这里插入图片描述
那么此时有两种办法:

  1. 在原数组进行修改
  2. 定义一个bool数组

第一种会修改原始数组的值,我们不推荐。
通常我们会采取第二种方式:
定义一个vis[m][n]数组:
在这里插入图片描述
只要我们遍历过次位置,就将定义为true.数组还有个作用,当我们发现值为1,为true时ret不用++反之false就++。

代码实现:

class Solution 
{
     //向量数组
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
    bool vis[301][301];
    int m,n;
public:
    int numIslands(vector<vector<char>>& grid)
     {
        m=grid.size(),n=grid[0].size();
        int ret = 0;
        for(int i=0;i <m; i++)
        {
            for(int j=0;j<n; j++)
            {    
                if(grid[i][j]=='1' && vis[i][j]==false)
                {   
                    ret++;
                    bfs(grid,i,j);// 把这块陆地全部标记一下了
                }
            }
        }
        return ret;
    }
    void bfs(vector<vector<char>>& grid,int i,int j)
    {
        queue<pair<int, int>> q;
        q.push({i,j});
        vis[i][j]= true;
        while(q.size())
        {
            auto [a,b]=q.front();
            q.pop();
            for(int k=0;k<4;k++)
            {
                int x=a+dx[k],y=b+dy[k];
                //防止越界
                if(x>=0&&x<m&&y>=0&&y<n&&y<n&&grid[x][y]=='1'&&vis[x][y]==false)
                {
                    //满足情况入队
                    q.push({x,y});
                    vis[x][y]=true;
                }
            }
        }
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/495925.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

缓冲区溢出漏洞相关知识点汇总

1.缓冲区基础知识相关定义 缓冲区定义&#xff1a;缓冲区一块连续的内存区域&#xff0c;用于存放程序运行时&#xff0c;加载到内存的运行代码和数据。 缓冲区溢出&#xff1a;缓冲区溢出是指程序运行时&#xff0c;向固定大小的缓冲区写入超过其容量的数据。多余的数据会越…

DFS:从递归去理解深度优先搜索

一、深入理解递归 二、递归vs迭代 三、深入理解搜索、回溯和剪枝 四、汉诺塔问题 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public: //笔试题&#xff0c;不讲武德&#xff0c;CAvoid move(int n,vector<int>& A, vector<int>& B, ve…

充值活动倒计时!快来get您的春日豪礼

春分已至 万物生辉 就在上周末 马拉松赛事霸屏朋友圈 不论是燃动全城的汉马 还是集结万人的锡马 马拉松精神给予我们的是 挑战自我、永不言弃 奋力前行、昂扬向上的力量 在这万物复苏的阳春三月 正是潜心钻研 奋力拼搏的好时节 神工坊为广大仿真行业科技工作者 送上春…

净化室内空气有妙招,约克VRF甲醛净化中央空调给全家人舒适守护

早春3月&#xff0c;春回大地&#xff0c;又到了万物复苏、草长莺飞的季节&#xff0c;但对于我们的呼吸道来说&#xff0c;这又是个高危时期。伴随气温的不断上升&#xff0c;各种细菌、病毒开始活跃起来&#xff0c;同时&#xff0c;春季也是花粉过敏的高发期。无论是甲醛、细…

因子分析全流程汇总

探索性因子分析&#xff08;以下简称因子分析&#xff09;&#xff0c;是毕业论文中常用的数据分析方法&#xff0c;用于研究多个变量之间的关系&#xff0c;并通过提取公共因子来简化数据集。 信息浓缩是因子分析最常见的应用&#xff0c;除此之外&#xff0c;因子分析还可以…

2.3 同步与互斥

1 2 3 4 5 6 7 8 9 10 11 12

【InternLM 实战营第二期笔记】书生·浦语大模型全链路开源体系及InternLM2技术报告笔记

大模型 大模型成为发展通用人工智能的重要途径 专用模型&#xff1a;针对特定任务&#xff0c;一个模型解决一个问题 通用大模型&#xff1a;一个模型应对多种任务、多种模态 书生浦语大模型开源历程 2023.6.7&#xff1a;InternLM千亿参数语言大模型发布 2023.7.6&#…

【ML】类神经网络训练不起来怎么办 5

【ML】类神经网络训练不起来怎么办 5 1. Saddle Point V.S. Local Minima(局部最小值 与 鞍点)2. Tips for training: Batch and Momentum(批次与 动量)2.1 Tips for training: Batch and Momentum2.2 参考文献:2.3 Gradient Descent2.4 Concluding Remarks(前面三讲)3.…

2024年AI威胁场景报告:揭示现今最大的AI安全挑战

AI正彻底改变每一个数据驱动的机会&#xff0c;有可能带来一个繁荣的新时代&#xff0c;让人类的生活质量达到难以想象的高度。但就像任何突破性的新技术一样&#xff0c;伟大的潜力往往蕴含着巨大的风险。 AI在很大程度上是有史以来部署在生产系统中的最脆弱的技术。它在代码…

寒冬继续!飞书发全员信 “适当精简团队规模”

多精彩内容在公众号。 3月26日飞书CEO谢欣发布全员信&#xff0c;宣布进行组织调整&#xff0c;同时为受到影响的“同学”提供补偿方案和转岗机会。 在致员工的一封信中&#xff0c;谢欣坦诚地指出&#xff0c;尽管飞书的团队人数众多&#xff0c;但组织结构的不够紧凑导致了工…

使用HarmonyOS实现图片编辑,裁剪、旋转、亮度、透明度

介绍 本篇Codelab是基于ArkTS的声明式开发范式的样例&#xff0c;主要介绍了图片编辑实现过程。样例主要包含以下功能&#xff1a; 图片的解码。使用PixelMap进行图片编辑&#xff0c;如裁剪、旋转、亮度、透明度、饱和度等。图片的编码。 相关概念 图片解码&#xff1a;读取…

经典机器学习模型(九)EM算法的推导

经典机器学习模型(九)EM算法的推导 1 相关数据基础 1.1 数学期望 1.1.1 数学期望的定义 根据定义&#xff0c;我们可以求得掷骰子对应的期望&#xff1a; E ( X ) X 1 ∗ p ( X 1 ) X 2 ∗ p ( X 2 ) . . . X 6 ∗ p ( X 6 ) 1 ∗ 1 6 2 ∗ 1 6 1 ∗ 1 6 3 ∗ 1 6 …

【考研数学】跟武忠祥,如何搭配汤家凤《1800》?

可以但不建议&#xff01;正所谓原汤化原食&#xff0c;你做1800&#xff0c;当然是听汤神的更合适&#xff01; 汤家凤与武忠祥的讲课风格真的大不相同&#xff01;汤老师特别注重基础和题量&#xff0c;让你在数理思维上打下扎实的根基。而武老师则更偏向于深厚的理论&#…

天地图如何获取多边形面积

目录 一、初始化地图 二、创建polygonTool 三、多边形获取面积 ​四、完整代码&#xff08;包括添加点、添加面、编辑面、获取面积&#xff09; 项目中提出在地图上绘制面并获取面积&#xff0c;如何实现&#xff1f; 在天地图官网的JavaScript API 中&#xff0c;链接如下…

午马传动已确定加入2024第13届生物发酵展

参展企业介绍 浙江午马传动有限公司&#xff0c;办公室地址位于中国长寿之乡、中国椪柑之乡、中国竹炭之乡丽水&#xff0c;浙江省丽水市青田县东源镇项村村前路99号四楼1号&#xff0c;我公司主要提供&#xff1a;齿轮及齿轮减、变速箱制造&#xff1b;机械设备销售&#xff1…

MySQL 8 索引原理详细分析

千山万水总是情, 问问索引行不行? 轻舟已过万重山, 有种尽管来发难。 索引是在数据库优化时的重要手段之一,今天 V 哥从索引的角度展开讲一讲索引的各个要点,希望可以通过这篇文章,帮助大家彻底搞透索引的关键点。 1.索引的定义与作用2.索引的类型3.索引原理4.二分查…

C#学生信息成绩管理系统

一、系统功能描述 本系统包括两类用户&#xff1a;学生、管理员。管理员可以通过系统来添加管理员信息、修改管理员信息、添加学生信息、修改学生信息&#xff1b;开设课程、查询课程、录入成绩、统计成绩、修改成绩、修改个人密码等&#xff0c;而学生则可以通过系统来选择课…

实现DevOps需要什么?

实现DevOps需要什么&#xff1f; 硬性要求&#xff1a;工具上的准备 上文提到了工具链的打通&#xff0c;那么工具自然就需要做好准备。现将工具类型及对应的不完全列举整理如下&#xff1a; 代码管理&#xff08;SCM&#xff09;&#xff1a;GitHub、GitLab、BitBucket、SubV…

智过网:考一级建造师证有什么用?可以从事哪些工作?

随着国家基础设施建设的不断推进&#xff0c;建筑行业在中国经济中占据了举足轻重的地位。在这样的背景下&#xff0c;一级建造师证成为了众多建筑从业者的追求目标。那么&#xff0c;考取一级建造师证究竟有哪些用处&#xff1f;又能从事哪些工作呢&#xff1f;本文将对此进行…

什么是通配符SSL证书?

在当前互联网环境中&#xff0c;数据传输安全至关重要&#xff0c;而通配符SSL证书作为保护多个子域名的理想工具&#xff0c;因其灵活、经济高效的特性而备受瞩目。本文将详细介绍通配符SSL证书的定义、主要特性及其价格区间。 通配符SSL证书的核心特性概述如下&#xff1a; …
最新文章