Flood Fill(一)

简介: 复习acwing算法提高课的内容,本篇为讲解算法:Flood Fill,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。

文章目录

前言

一、Flood Fill

二、例题,代码

AcWing 1097. 池塘计数

本题分析

AC代码

AcWing 1098. 城堡问题

本题分析

AC代码

AcWing 1106. 山峰和山谷

本题分析

AC代码

三、时间复杂度


前言

复习acwing算法提高课的内容,本篇为讲解算法:Flood Fill,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。


一、Flood Fill

Flood Fill算法是搜索的算法中的一种,用来解决类似田地覆盖这么一系列问题,算法核心是BFS


二、例题,代码

AcWing 1097. 池塘计数

本题链接:AcWing 1097. 池塘计数

本博客提供本题截图:

image.png

image.png

本题分析

本题就是水的覆盖问题,可以用bfs去解,核心思路就是从第一行第一列(即图中的第一个元素)去遍历,这里需要一个bool st[N][N]数组去记录这个点有没有被遍历过,如果被遍历过的话直接跳过这个点就可以了,我们每次挑选合适的点放入到队列之中,并用这个点作为“母点”去向8个方向去扩散,这里扩散的时候没有使用向量的方法,对于四扩散向量的方法很简单,但是对于8个方向的扩散,显然这里用一个二重for循环可以比较容易的解决问题,注意特判for循环中的条件,对于不符合条件的点continue

if (t.x == i && t.y == j) continue;      //遍历到这个点的时候continue
if (i < 0 || i >= n || j < 0 || j >= m) continue; //越界的时候continue
if (g[i][j] == '.' || st[i][j]) continue;   //这个点如果不是水的话或者这个点之前被遍历过的话就continue

这样三个if判断之后的点一定是符合题意可以扩散水的点,那么就把这个点放到队列中,并把这个点的bool值变成true

q[++ tt] = {i, j};
st[i][j] = true;

AC代码

#include <cstdio>
#include <algorithm>
#include <map>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 1010, M = N * N;
PII q[M];
char g[N][N];
bool st[N][N];
int n, m, cnt;
void bfs(int x1, int y1)
{
    int hh = 0, tt = 0;
    q[0] = {x1, y1};
    st[x1][y1] = true;
    while (hh <= tt)
    {
        auto t = q[hh ++];
        for (int i = t.x - 1; i <= t.x + 1; i ++ )
            for (int j = t.y - 1; j <= t.y + 1; j ++ )
            {
                if (t.x == i && t.y == j) continue;
                if (i < 0 || i >= n || j < 0 || j >= m) continue;
                if (g[i][j] == '.' || st[i][j]) continue;
                q[++ tt] = {i, j};
                st[i][j] = true;
            }
    }
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i ++ ) scanf("%s", g[i]);
    for (int i = 0; i < n; i ++ )
        for (int j = 0; j < m; j ++ ) 
            if (!st[i][j] && g[i][j] == 'W')
            {
                bfs(i, j);
                cnt ++;
            }
    printf("%d", cnt);
    return 0;
}

AcWing 1098. 城堡问题

本题链接:AcWing 1098. 城堡问题

本博客提供本题截图:

image.png

image.png

本题分析

和上一个题目基本一致,不同的有两点,一点是上一个题是八扩散,用的是两重for循环,这个题是四扩散,用的是向量,第二个不同是如何把数字形象化:位运算。

AC代码

#include <cstdio>
#include <map>
#include <algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 55, M = N * N;
PII q[M];
int g[N][N];
bool st[N][N];
int n, m;
int bfs(int x1, int y1)
{
    int area = 0;
    int dx[4] = {0, -1, 0, 1}, dy[4] = {-1, 0, 1, 0};
    int hh = 0, tt = 0;
    q[0] = {x1, y1};
    st[x1][y1] = true;
    while (hh <= tt)
    {
        auto t = q[hh ++];
        area ++;
        for (int i = 0; i < 4; i ++ )
        {
            int a = t.x + dx[i], b = t.y + dy[i];
            if (a < 0 || a >= n || b < 0 || b >= m) continue;
            if (g[t.x][t.y] >> i & 1) continue;
            if (st[a][b]) continue;
            q[++ tt] = {a, b};
            st[a][b] = true;
        }
    }
    return area;
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i ++ ) 
        for (int j = 0; j < m ; j ++ )
            scanf("%d", &g[i][j]);
    int cnt = 0, area = 0;
    for (int i = 0; i < n; i ++ ) 
        for (int j = 0; j < m; j ++ )
            if (!st[i][j])
            {
                cnt ++;
                area = max (area, bfs(i, j));
            }
    printf("%d\n%d\n", cnt, area);
    return 0;
}


目录
相关文章
|
存储 Java 定位技术
gis利器之Gdal(二)shp数据读取
本文首先简单介绍了空间数据shp数据的基本知识,其常见的文件组成形式。使用qgis软件对数据进行常规预览,最后重点介绍了使用gdal对矢量信息进行读取,​包括空间信息和属性信息
1734 0
gis利器之Gdal(二)shp数据读取
|
存储 JSON 关系型数据库
基于GeoTools的GeoJson导入到PostGis实战
GeoJson是一种对各种地理数据结构进行编码的格式,基于json的地理空间信息数据交换格式。GeoJson对象可以用来表示几何,特征或者特征集合。支持地理点、线、面、多点、多线、多面及几何集合。GeoJson不是本文的重点,因此不再赘述。
2447 0
基于GeoTools的GeoJson导入到PostGis实战
|
Linux 数据库 数据安全/隐私保护
如何使用 Docker 安装宝塔面板
Docker 是一个高效、灵活、轻量级的容器化平台,可以在单个操作系统上实现多个容器化应用的隔离和运行。而宝塔面板是一款集成了 Web 服务器、数据库和运行环境的 Linux 服务器管理面板,其功能非常强大且易于使用。在本文中,我们将介绍使用 Docker 安装宝塔面板的优势和详细命令,让您轻松搭建自己的 Web 服务。
8528 3
|
应用服务中间件 nginx
nginx优化:URI过长或request header过大导致400或414报错
当出现URI过长或请求头过大导致400或414报错时,可以通过以下方式对Nginx进行优化: 1. 调整client_max_body_size参数:该参数用于限制请求体的大小。默认情况下,Nginx的client_max_body_size参数设置为1M。如果请求体超过这个大小,Nginx会返回400错误。您可以根据实际需求适当增加这个值,例如设置为10M或更大。 ``` http { client_max_body_size 10M; } ``` 2. 调整large_client_header_buffers参数:该参数用于调整请求头缓冲区的大
8070 0
|
机器学习/深度学习 存储 人工智能
英特尔AMX助力阿里云提升推荐模型性能
本文详细介绍阿里云人工智能平台PAI团队研发的PAI-REC以白盒化的方式快速构建推荐全链路方案,帮助用户更好的落地深度学习推荐算法。
|
12月前
|
缓存 自然语言处理 算法
大模型意图识别工程化实践
本文重点介绍大模型意图识别能力在智能电视核心链路中的落地过程和思考,对比了基础模型、RAG 、以及7b模型微调三种方案的优缺点。
5152 122
|
前端开发 Java 应用服务中间件
【Tomcat源码分析 】"深入探索:Tomcat 类加载机制揭秘"
本文详细介绍了Java类加载机制及其在Tomcat中的应用。首先回顾了Java默认的类加载器,包括启动类加载器、扩展类加载器和应用程序类加载器,并解释了双亲委派模型的工作原理及其重要性。接着,文章分析了Tomcat为何不能使用默认类加载机制,因为它需要解决多个应用程序共存时的类库版本冲突、资源共享、类库隔离及JSP文件热更新等问题。最后,详细展示了Tomcat独特的类加载器设计,包括Common、Catalina、Shared、WebApp和Jsp类加载器,确保了系统的稳定性和安全性。通过这种设计,Tomcat实现了不同应用程序间的类库隔离与共享,同时支持JSP文件的热插拔。
【Tomcat源码分析 】"深入探索:Tomcat 类加载机制揭秘"
|
11月前
|
JSON JavaScript 前端开发
shpfile转GeoJSON;控制shp转GeoJSON的精度;如何获取GeoJSON;GeoJSON是什么有什么用;GeoJSON结构详解(带数据示例)
在使用Openlayers、leaflet、mapbox等地图控件的时候,GeoJSON几乎是不可避免打交道的数据类型,如果您想要从事gis行业相关的开发工作,本篇文章应该能为您带来一些帮助。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
传感器 数据采集 算法
python实现ModBusRTU客户端方式
python实现基于串口通信的ModBusRTU客户端是一件简单的事情,只要通过pymodbus模块就可以实现。