AcWing算法提高课-2.1.1池塘计数

news2024/11/15 17:54:49

宣传一下算法提高课整理 <—

CSDN个人主页:更好的阅读体验 <—

csdn

题目传送门点这里

题目描述

农夫约翰有一片 N∗M 的矩形土地。

最近,由于降雨的原因,部分土地被水淹没了。

现在用一个字符矩阵来表示他的土地。

每个单元格内,如果包含雨水,则用”W”表示,如果不含雨水,则用”.”表示。

现在,约翰想知道他的土地中形成了多少片池塘。

每组相连的积水单元格集合可以看作是一片池塘。

每个单元格视为与其上、下、左、右、左上、右上、左下、右下八个邻近单元格相连。

请你输出共有多少片池塘,即矩阵中共有多少片相连的”W”块。

输入格式

第一行包含两个整数 N 和 M。

接下来 N 行,每行包含 M 个字符,字符为”W”或”.”,用以表示矩形土地的积水状况,字符之间没有空格。

输出格式

输出一个整数,表示池塘数目。

数据范围

1 ≤ N , M ≤ 1000 1≤N,M≤1000 1N,M1000

样例输入

10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.

样例输出

3

思路

Flood Fill算法,好高大上的名字!
但它其实就是BFS

用途: 求一个图形中连通块的个数

步骤:

  1. 找到任意一个连通块包含的点,这步可以直接遍历找
  2. 在这个连通块上跑BFS,把这个连通块的所有点都打上标记(当然,把W改成.也是可以的)
  3. 继续找连通块,重复步骤1和2,直到所有连通块都被遍历过
  4. 找到一个连通块就给答案加一,输出答案即可

注意:

  • 图里面的字符大小写和全半角不要搞混
  • 输入的时候不要按字符输入,不然会输进去\nspace这些奇奇怪怪的东西,导致WA
  • 可以放心用STL的queue,不会超时

算法时间复杂度

BFS差不多会把所有点跑一遍,因此时间复杂度差不多是 O ( n m ) O(nm) O(nm)


AC Code

C + + C++ C++

#include <iostream>
#include <queue>

using namespace std;

typedef pair<int, int> PII;

const int N = 1010;
int dx[] = {1, 1, 1, 0, -1, -1, -1, 0};
int dy[] = {-1, 0, 1, 1, 1, 0, -1, -1};

int n, m;
char a[N][N];
int res;

void bfs(int x, int y)
{
    queue<PII> q;
    q.push({x, y});
    while (q.size())
    {
        auto t = q.front();
        q.pop();
        int px = t.first, py = t.second;
        for (int i = 0; i < 8; i ++ )
        {
            int xx = px + dx[i], yy = py + dy[i];
            if (xx >= 0 && xx < n && yy >= 0 && yy < m && a[xx][yy] == 'W')
            {
                a[xx][yy] = '.';
                q.push({xx, yy});
            }
        }
    }
}

int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i ++ )
        scanf("%s", &a[i]);

    for (int i = 0; i < n; i ++ )
        for (int j = 0; j < m; j ++ )
            if (a[i][j] == 'W')
            {
                bfs(i, j);
                res ++ ;
            }

    printf("%d\n", res);

    return 0;
}

a

最后,如果觉得对您有帮助的话,点个赞再走吧!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EasyRecovery16最新免费版电脑数据恢复软件功能介绍

EasyRecovery是一款支持Windows/Mac平台进行恢复图片的专业工具&#xff0c;尤其是各种流行单反相机RAW格式文件&#xff0c;以及超大型视频文件等&#xff0c;推荐摄影爱好者使用。适用于主流相机、无人机、PC、存储卡、USB 闪存驱动器等&#xff0c;由于删除、损坏或意外格式…

【项目精选】医院管理住院系统的研究与实现(源码+论文+视频)

点击下载源码 本系统主要分为六大模块&#xff0c;分别是医生管理模块、病人管理模块、病床管理模块、收费管理模块、统计分析模块和系统功能模块 &#xff0c;医生、病人和医院的管理人员都可以通过此系统寻找出自己所需要的信息。 1.1 背景 医院管理住院系统是当今大部分现代…

Nginx安装及介绍

前言&#xff1a;传统结构上(如下图所示)我们只会部署一台服务器用来跑服务&#xff0c;在并发量小&#xff0c;用户访问少的情况下基本够用但随着用户访问的越来越多&#xff0c;并发量慢慢增多了&#xff0c;这时候一台服务器已经不能满足我们了&#xff0c;需要我们增加服务…

华为OD机试用Python实现 -【天然蓄水库 or 天然蓄水池】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲天然蓄水库 or 天然蓄水池题目描述输入描述输出描述说明示例一输入输出说明示例二输入输出说明示例三输入输出说明Python 代码实现算法思路华为OD机试300题大纲 参加华为

Android 分区和内存监控

Andorid之所以是分区&#xff0c;是因为各自有对应的功能和用途的考量&#xff0c;可以进行单独读写和格式化。Android 设备包含两类分区&#xff1a;一类是启动分区&#xff0c;对启动过程至关重要。一类是用户分区&#xff0c;用于存储与启动无关的信息。启动分区boot 分区一…

HTML综合案例练习

一、展示简历内容 可以首先看一下我们的效果&#xff0c;之后再思考怎么实现 总的来说&#xff0c;这个练习不算难。 这里关于这个简历的代码编写我们不说太多&#xff0c;只注意以下几个内容即可&#xff1a; 注意及时查看我们的代码是否符合预期&#xff0c;即一段一段测 …

@ModelAttribute注释,接收用户不能做出修改的值,定义好值不变化

举例&#xff1a;有时候我们做修改的时候&#xff0c;比如用户的生日&#xff0c;和姓名用身份证验证之后就默认了你的资料&#xff0c;后期在修改个人资料的时候是不允许修改的&#xff0c;只能修改兴趣等等......1.设置实体类User&#xff0c;定义好属性&#xff0c;以及get,…

进程优先级(Linux)

目录 优先级VS权限 基本概念 查看系统进程 几个重要信息 PRI and NI PRI vs NI top命令 上限&#xff1a; 详细步骤 下限&#xff1a; 其他概念 优先级VS权限 权限&#xff1a;能or不能 优先级&#xff1a;已经能&#xff0c;但是谁先谁后的问题&#xff08;CPU资源有…

(十七)操作系统-进程同步、互斥

文章目录一、知识总览二、进程同步三、进程互斥1. 临界资源2. 互斥3. 对临界资源的互斥访问&#xff0c;在逻辑上分为四个部分4. 为了实现对临界资源的互斥访问&#xff0c;同时保证系统整体性能&#xff0c;需要遵循的原则五、总结一、知识总览 二、进程同步 同步亦称直接制约…

Kubernetes学习笔记-pod与集群节点的自动伸缩20230225

前言pod手动横向扩展&#xff1a;通过ReplicationController、ReplicaSet、Deployment等可伸缩资源的replicas字段&#xff0c;来手动实现pod中应用的横向扩展。pod纵向扩展&#xff1a;通过增加pod容器的资源请求和限制&#xff08;pod创建时&#xff09;pod自动横向扩展&…

Allegro如何快速把视图居中显示操作指导

Allegro如何快速把视图居中显示操作指导 用Allegro进行PCB设计的时候,为了方便检查和设计,时常需要将视图居中显示。一般地,会使用鼠标的中键进行放大和缩小,或者使用Zoom in和Zoom out来调整视图 Allegro还支持快速将视图居中 具体操作如下 点击View

Flume三种组件的选择对比

文章目录1.source2.channel3.sink1.source Source: 数据源:通过source组件可以指定让Flume读取哪里的数据&#xff0c;然后将数据传递给后面的 channel Flume内置支持读取很多种数据源&#xff0c;基于文件、基于目录、基于TCP\UDP端口、基于HTTP、Kafka的 等等、当然了&#x…

基于Windows下离线安装当前最新Arduino ESP32 SDK(2.0.7)固件开发包

基于Windows下离线安装当前最新Arduino ESP32 SDK&#xff08;2.0.7&#xff09;固件开发包✨写这篇的文章的初衷&#xff0c;是由于在前几天想通过离线一键安装包方式实现升级安装&#xff0c;结果发现解压后&#xff0c;可以找到开发板&#xff0c;但是无法上传代码&#xff…

JavaSe第3次笔记

1.String str "hello";字符串类型。 2.两个字符串类型相加意思是拼接&#xff0c;类似于c语言里面的strcat函数。 3.整型变成字符串类型: int a 10; String str String. valueOf(a); 4.当字符串和其他类型进行相加的时候&#xff0c;结果就是字符串。(不完全…

imporve-3

JSX语法糖本质 JSX是语法糖&#xff0c;通过babel转成React.createElement函数&#xff0c;在babel官网上可以在线把JSX转成React的JS语法 首先解析出来的话&#xff0c;就是一个createElement函数然后这个函数执行完后&#xff0c;会返回一个vnode通过vdom的patch或者是其他的…

Java基础--IO操作

一、IO原理及分类 一、IO原理 1、I/O是Input/Output的缩写&#xff0c;I/O技术是非常实用的技术&#xff0c;用于处理设备之间的数据传输&#xff0c;如读写文件&#xff0c;网络通信等。 2、java程序中对于数据的输入/输出操作一般都是以流的方式进行 3、java.io包下提供各…

【LeetCode】剑指 Offer(9)

目录 题目&#xff1a;剑指 Offer 25. 合并两个排序的链表 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 26. 树的子结构 - 力扣&#…

阿里测试经验7年,从功能测试到自动化测试,我整理的超全学习指南

做测试七年多&#xff0c;有不少人问过我下面问题&#xff1a; 现在的手工测试真的不行了吗&#xff1f; 测试工程师&#xff0c;三年多快四年的经验&#xff0c;入门自动化测试需要多久&#xff1f; 自学自动化测试到底需要学哪些东西&#xff1f; 不得不说&#xff0c;随着…

TCKGE: Transformers with contrastive learning for knowledge graph embedding

概述&#xff1a; 以前的一些知识图谱嵌入方法由于其浅层的网络结构&#xff0c;不能解决复杂的多关系知识图谱。因此文中针对此种现象&#xff0c;提出了TCKGE——针对于学习多关系知识图谱中复杂的语义信息。TCKGE能够有效的捕获知识图谱中丰富的语义信息&#xff0c;其利用了…

论文阅读_DALLE-2的unCLIP模型

论文信息 name_en: Hierarchical Text-Conditional Image Generation with CLIP Latents name_ch: 利用CLIP的层次化文本条件图像生成 paper_addr: http://arxiv.org/abs/2204.06125 doi: 10.48550/arXiv.2204.06125 date_read: 2023-02-12 date_publish: 2022-04-12 tags: [‘…