【优选算法】BFS解决FloodFill算法

一、经验总结

什么是FloodFill算法?

FloodFill算法是一种用于填充连通区域的算法,通常用于图像处理和计算机图形学中。它从给定的起始点开始,向周围相邻的像素进行扩散填充,直到遇到边界或者其他指定条件停止。

FloodFill算法还可以用于统计连通块的数量,求各连通块的面积等。

BFS解决FloodFill算法

当使用BFS解决FloodFill算法时,可以从一个起始点开始,逐步向外扩展,一层层地遍历并填充相邻的空白区域。

需要注意的点:

  1. 使用队列来辅助实现BFS
  2. 创建横纵坐标的变化量数组,可以方便地遍历相邻地四个方向
  3. 可以使用两种方法防止重复地入队列访问:1.直接修改原数组 2.创建visited数组标记访问;不管是哪种方法都需要在元素入队列时进行修改,以防止同层元素的重复访问

二、相关编程题

2.1 图像渲染

题目链接

733. 图像渲染 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

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(color == prev) return image;
        int m = image.size(), n = image[0].size();
        queue<PII> que;
        que.push({sr,sc});
        image[sr][sc] = color;
        while(!que.empty())
        {
            auto [r, c] = que.front();
            que.pop();
            for(int i = 0; i < 4; ++i)
            {
                int x = r+dx[i], y = c+dy[i];
                if(x>=0 && x<m && y>=0 && y<n && image[x][y]==prev)
                {
                    que.push({x, y});
                    image[x][y] = color;
                }
            }
        }
        return image;
    }
};

2.2 岛屿数量

题目链接

200. 岛屿数量 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
    typedef pair<int,int> PII;
    vector<vector<bool>> visited;
    int m, n;
    int dx[4] = {0, 0, -1, 1};
    int dy[4] = {1, -1, 0, 0};
public:
    int numIslands(vector<vector<char>>& grid) 
    {
        m = grid.size(), n = grid[0].size();
        visited.resize(m, vector<bool>(n, false));
        int ret = 0;
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                if(grid[i][j]=='1' && !visited[i][j])
                {
                    ++ret;
                    BFS(grid, i, j);
                }
            }
        }
        return ret;
    }
    void BFS(vector<vector<char>>& grid, int sx, int sy)
    {
        queue<PII> que;
        que.push({sx, sy});
        visited[sx][sy] = true;
        while(!que.empty())
        {
            auto [a, b] = que.front();
            que.pop();
            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&&grid[x][y]=='1'&&!visited[x][y])
                {
                    que.push({x,y});
                    visited[x][y] = true;
                }
            }
        }
    }
};

2.3 岛屿的最大面积

题目链接

695. 岛屿的最大面积 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

同上,只需要在BFS的过程中顺便统计一下陆地面积即可(同样是在入队列时统计面积,防止重复记录)。

编写代码

class Solution {
    typedef pair<int,int> PII;
    vector<vector<bool>> visited;
    int m, n;
    int dx[4] = {0, 0, -1, 1};
    int dy[4] = {1, -1, 0, 0};
public:
    int maxAreaOfIsland(vector<vector<int>>& grid) 
    {
        m = grid.size(), n = grid[0].size();
        visited.resize(m, vector<bool>(n, false));
        int area_max = 0;
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                if(grid[i][j]==1 && !visited[i][j])
                    area_max = max(area_max, BFS(grid, i, j));
            }
        }
        return area_max;
    }
    int BFS(vector<vector<int>>& grid, int sx, int sy)
    {
        int area = 0;
        queue<PII> que;
        que.push({sx, sy});
        visited[sx][sy] = true;
        ++area;
        while(!que.empty())
        {
            auto [a, b] = que.front();
            que.pop();
            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&&grid[x][y]==1&&!visited[x][y])
                {
                    que.push({x,y});
                    visited[x][y] = true;
                    ++area;
                }
            }
        }
        return area;
    }
};

2.4 被围绕的区域

题目链接

130. 被围绕的区域 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
    int m, n;
    int dx[4] = {0, 0, 1, -1};
    int dy[4] = {1, -1, 0, 0};
public:
    void solve(vector<vector<char>>& board) {
        m = board.size(), n = board[0].size();
        //1.先将边界上的'O'连通块修改为'.'
        for(int i = 0; i < m; ++i)
        {
            if(board[i][0] == 'O') BFS(board, i, 0);
            if(board[i][n-1] == 'O') BFS(board, i, n-1);
        }
        for(int j = 0; j < n; ++j)
        {
            if(board[0][j] == 'O') BFS(board, 0, j);
            if(board[m-1][j] == 'O') BFS(board, m-1, j);
        }

        //2.将剩下的'O'改为'X',边界上的'.'改回'O'
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                if(board[i][j] == 'O') board[i][j] = 'X';
                if(board[i][j] == '.') board[i][j] = 'O';
            }
        }
    }

    void BFS(vector<vector<char>>& board, int sx, int sy)
    {
        queue<pair<int,int>> que;
        que.push({sx, sy});
        board[sx][sy] = '.';
        while(!que.empty())
        {
            auto [a,b] = que.front();
            que.pop();
            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&&board[x][y]=='O')
                {
                    que.push({x,y});
                    board[x][y] = '.';
                }
            }
        }
    }
};

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

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

相关文章

H5即时通讯群聊源码无限建群创群/H5聊天系统聊天网站源码/H5语音聊天系统

源码介绍 支持自助建群 管理群 修改群资料支持自动登录 登陆成功可自助修改资料后台可查看群组聊天消息记录支持表情 动态表情 图片发布支持消息语音提醒

6月4(信息差)

&#x1f30d;AI预测极端天气提速5000倍&#xff01;微软发布Aurora&#xff0c;借AI之眼预测全球风暴 &#x1f384;理解老司机&#xff0c;超越老司机&#xff01;LeapAD&#xff1a;具身智能加持下的双过程自驾系统&#xff08;上海AI Lab等&#xff09; 论文题目&#xf…

Java_List集合

特点、特有方法 ArrayList : 有序、可重复、有索引。 LinkedList&#xff1a;有序、可重复、有索引。 底层实现不同&#xff01;适合场景不同&#xff01; List 集合的特有方法 List 集合因为支持索引&#xff0c;所以多了很多索引相关的方法&#xff0c;当然&#xff0c;C…

Java多线程核心工具类

1.Thread类&#xff1a;代表一个线程。你可以通过继承Thread类或实现Runnable接口来创建线程。 2.Executor框架&#xff1a;java.util.concurrent.Executors和java.util.concurrent.Executor接口提供了一种创建和管理线程池的方法&#xff0c;可以减少在创建和销毁线程上的开销…

Hive 基本操作

1.启动Hadoop集群 2.将学生信息上传到/bigdata/hive/hive_stu目录下 查看测试数据 3.进入hive,切换到db_test库&#xff08;如没有&#xff0c;可以先创建 create database db_test&#xff09;

webf 开发工具:数据库持久层基础文件生成工具

WZW.SqlMapHelpForJava是运行在.Net Framework4.0上的数据库持久层基础文件生成工具&#xff0c;支持多种关系型数据库的持久层基础文件、Java类的生成以及对配置文件的更新&#xff0c;与webf框架进行紧密配合&#xff0c;减少了数据库持久层基础文件编写工作量&#xff0c;提…

常用运维工具之 WGCLOUD(国产软件)介绍

WGCLOUD是一款免费开源的运维监控软件&#xff0c;轻量高效&#xff0c;部署方便&#xff0c;上手简单&#xff0c;界面简单流畅 WGCLOUD是国产运维软件&#xff0c;可以适配大部分的信创环境&#xff0c;比如麒麟、统信等操作系统 WGCLOUD具体支持监控的操作系统如下&#x…

Qt OPC UA通信

介绍 OPC UA全称Open Platform Unified Architecture&#xff0c;开放平台统一架构&#xff0c;是工业自动化领域通用的数据交换协议&#xff0c;它有两套主要的通信机制&#xff1a;1.客户端-服务器通信&#xff1b;2.发布订阅。Qt对OPC UA通信标准也提供了支持&#xff0c;目…

【前端】微信小程序前端开发通过weixin://wxpay/bizpayurl生成支付二维码

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。公粽号&#xff1a;洲与AI。 &#x1f913; 欢迎大家关注我的专栏&#xff0c;我将分享Web前后端开发、…

2024深圳市福田区幼儿园地图小程序

根据深圳教育2024年福田区幼儿园名单制作了一个简单的幼儿园地图。 数据来源&#xff1a;https://www.szftedu.cn/gk/xxxx/202302/t20230203_143313.html 2024年福田区幼儿园名单&#xff1a;https://www.szftedu.cn/gk/xxxx/202302/P020240402526108008524.pdf 源码&#x…

代理记账公司的五大问题及其解决方案

代理记账公司是现代企业管理中不可或缺的一部分&#xff0c;它为企业的日常运营提供了专业、高效的服务&#xff0c;随着行业的发展和竞争的加剧&#xff0c;代理记账公司的面临的问题也日益突出&#xff0c;这些问题主要表现在以下几个方面&#xff1a; 业务流程不规范 许多代…

腾讯云centos上安装docker

下面的操作是在root用户下操作的,如果非root用户在命令行前加上sudo 1. 系统及内核查看 操作系统&#xff1a;64位的CentOS 7或更新版本。内核版本&#xff1a;最低要求是3.10&#xff0c;推荐使用3.10或更高版本。 #查看内核版本 (base) [klfwjfweaVM-0-6-centos ~]$ uname…

Java-springBoot常用注解讲解

一、Configuration 注解和Bean 注解 Configuration 可以理解为spring xml配置中的<beans>标签,Bean可理解为用spring的时候xml里面的<bean>标签Configuration 注解的是类,Bean 注解域为方法,对象在Spring Boot 5.2之后的Configuration注解多了一个属性proxyBeanMet…

数据结构:一般哈希

数据结构&#xff1a;一般哈希 题目描述参考代码拉链法开放寻址法 题目描述 输入样例 5 I 1 I 2 I 3 Q 2 Q 5输出样例 Yes No参考代码 拉链法 #include <iostream> #include <cstring> using namespace std;const int N 100003;int h[N], e[N], ne[N], idx;vo…

基于PHP+MySQL开发的一套游泳馆预约报名小程序开发源码模板

最近新开发了一套游泳馆线上预约报名小程序&#xff0c;其主要功能有预约功能&#xff0c;报名功能&#xff0c;支付功能&#xff0c;个人中心&#xff0c;订单管理&#xff0c;商品管理等等。 游泳馆预约报名小程序系统-运行环境 开发语言&#xff1a;PHP 数据库&#xff1a;M…

对接专有钉钉(浙政钉)登陆步骤

背景 因为项目需要对接浙政钉&#xff0c;我想应该和之前对接阿里云的钉钉登陆钉钉登陆类似&#xff0c;就上网搜索看看&#xff0c;出现了个专有钉钉的概念&#xff0c;就一时间搞不清楚&#xff0c;钉钉&#xff0c;专有钉钉&#xff0c;浙政钉的区别&#xff0c;后续稍微理…

向阳而生,逐光而行。—定制化系统解决方案—

风之所及&#xff0c;皆有麦浪 目之所及&#xff0c;皆为所向

Precision和Recall

Precision&#xff08;精确率 / 查准率&#xff09;和 Recall&#xff08;召回率 / 查全率&#xff09;是分类任务中常用的两种性能度量&#xff0c;它们用于评估模型在处理二分类或多分类问题时的表现。 Precision&#xff08;精确率&#xff09; 精确率衡量的是模型预测为正…

干货!如何在Jmeter中实现对NCR响应的解析

最近做接口测试时发现了一个问题&#xff0c;部分请求的响应是通过NCR编码实现的&#xff0c;这样就导致了无法对这些请求进行断言&#xff0c;为了解决这个问题进行了如下调研&#xff0c;大家可以参考下面两篇文章&#xff1a; 使用Java apache commons包五分钟搞定NCR解析&…

智慧校园应用平台的全面建设

在当今社会&#xff0c;随着科技的不断进步&#xff0c;智慧校园应用平台逐渐成为学校管理的必备工具。在实现智慧校园全面建设的过程中&#xff0c;学校需要运用先进的技术和创新的理念&#xff0c;为教育提供更好的服务和支持。这篇文章将为您介绍智慧校园应用平台的全面建设…