时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

璐神现在有张n*m大小的地图,地图上标明了陆地(用"#"表示)和海洋(用"."表示),现在璐神要计算这张地图上岛屿的数量。
已知岛屿是由陆地的连通块组成,即一块陆地的上、下、左、右,左上,右上,左下,右下有其他陆地,则构成连通块,以此类推。
此外,岛屿的详细定义如下:
1、岛屿的周围必须全是海洋。
2、如果连通块有任意区域在地图边界,则该连通块不是岛屿。

输入描述:

第1行输入两个整数n,m,代表地图的长和宽。
第2-n+1行,每行输入m个字符,字符为"#"表示陆地,为"."表示海洋。
数据保证:0<n,m≤200

输出描述:

输出一行整数,代表岛屿的数量。
示例1

输入

3 3
...
.#.
...

输出

1

说明

只有中间的1块陆地是岛屿,所以岛屿数=1
示例2

输入

3 3
#..
.#.
...

输出

0

说明

中间的连通块有区域在边界,所以不是岛屿,岛屿数=0。

【分析】:bfs 求解连通块,注意的是在求解过程中,如果出现连通块区域在边界,则记录此连通块无效,但仍需将 bfs 操作进行完。
【代码】:
#include <bits/stdc++.h>

using namespace std;
const int maxn = ;
char mp[][];
int vis[maxn][maxn]={};
int dir[][] ={{,},{,},{-,},{,-},{-,-},{-,},{,-},{,}};
int n,m,flag=; void dfs(int x,int y)
{
vis[x][y]=;
if(x==||y==||x==n-||y==m-)
flag=;
for(int i=;i<;i++)
{
int tx=x+dir[i][];
int ty=y+dir[i][];
if(mp[tx][ty]=='#'&&tx>=&&ty>=)
{
mp[tx][ty]='.';
dfs(tx,ty);
}
}
}
int main()
{
int sum=;
cin>>n>>m;
for(int i=;i<n;i++)
cin>>mp[i];
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
if(mp[i][j]=='#')
{
flag=;
dfs(i,j);
if(flag==)
sum++;
}
}
}
cout<<sum<<endl;
return ;
}

DFS

#include<bits/stdc++.h>
using namespace std; const int maxn=; char mp[maxn][maxn];
int vis[maxn][maxn];
const int dir[][]={{,},{-,},{,},{,-},{,},{,-},{-,},{-,-}}; int n,m,ans=; void bfs(int x,int y){
if(mp[x][y]=='.'){
vis[x][y]=;
return;
}
if(x==||y==||x==n-||y==m-){
vis[x][y]=;
// return;
} queue<pair<int,int> >q;
q.push(make_pair(x,y));
while(!q.empty()){
int nowx=q.front().first;
int nowy=q.front().second;
if(nowx==||nowy==||nowx==n-||nowy==m-){
vis[x][y]=;
//return;
}
q.pop();
for(int i=;i<;++i){
int x1=nowx+dir[i][];
int y1=nowy+dir[i][];
if(vis[x1][y1]==&&mp[x1][y1]=='#'){
vis[x1][y1]=;
q.push(make_pair(x1,y1));
}
}
}
} int main(){
while(cin>>n>>m){
memset(mp,,sizeof(mp));
memset(vis,false,sizeof(vis));
ans=;
for(int i=;i<n;++i)
cin>>mp[i];
for(int i=;i<n;++i){
for(int j=;j<m;++j){
if(!vis[i][j]){
vis[i][j]=;
bfs(i,j);
if(vis[i][j]==){ ans++;
}
}
}
}
cout<<ans<<endl;
} return ;
}

BFS

中矿新生赛 H 璐神看岛屿【BFS/DFS求联通块/连通块区域在边界则此连通块无效】的更多相关文章

  1. 2019-ACM-ICPC-南昌区网络赛-H. The Nth Item-特征根法求通项公式+二次剩余+欧拉降幂

    2019-ACM-ICPC-南昌区网络赛-H. The Nth Item-特征根法求通项公式+二次剩余+欧拉降幂 [Problem Description] ​ 已知\(f(n)=3\cdot f(n ...

  2. Codeforces 801 A.Vicious Keyboard & Jxnu Group Programming Ladder Tournament 2017江西师大新生赛 L1-2.叶神的字符串

    A. Vicious Keyboard time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  3. 湖南师范大学2018年大学生程序设计竞赛新生赛 A 齐神和心美的游戏【hash】

    [链接]:A [题意]:给你n个数的序列和k.判断是否可以三个数组成k(同一个数可以拿多次) [分析]:每个数vis记录一下.2层循环.两数之和不超过k以及剩下的数出现在序列中那么ok. [代码]: ...

  4. SCNU 2015ACM新生赛决赛【F. Oyk闯机关】解题报告

            题目大意:一个$N$$\times$$N$的阵列,每个格子有$X_{ij}$个调和之音,若每次只能选择走右边或下边,从左上角出发走到右下角,问最多能收集到多少个调和之音?       ...

  5. SCNU ACM 2016新生赛初赛 解题报告

    新生初赛题目.解题思路.参考代码一览 1001. 无聊的日常 Problem Description 两位小朋友小A和小B无聊时玩了个游戏,在限定时间内说出一排数字,那边说出的数大就赢,你的工作是帮他 ...

  6. [ACTF2020 新生赛]BackupFile && [ACTF2020 新生赛]Upload &&[GYCTF2020]Blacklist

    [ACTF2020 新生赛]BackupFile 尝试找到源代码,加上题目是备份文件,猜测备份文件里面有网站的源代码,御剑扫描一下,就扫到index.php 访问index.php.bak 下载源代码 ...

  7. [BUUCTF]REVERSE——[ACTF新生赛2020]usualCrypt

    [ACTF新生赛2020]usualCrypt 附件 步骤: 例行检查,无壳,32位程序 32位ida载入,直接看main函数 逻辑很简单,一开始让我们输入一个字符串,然后该字符串经过sub_4010 ...

  8. 2013年省赛H题

    2013年省赛H题你不能每次都快速幂算A^x,优化就是预处理,把10^9预处理成10^5和10^4.想法真的是非常巧妙啊N=100000构造两个数组,f1[N],间隔为Af2[1e4]间隔为A^N,中 ...

  9. 2018 ACMICPC上海大都会赛重现赛 H - A Simple Problem with Integers (线段树,循环节)

    2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 H - A Simple Problem with Integers (线段树,循环节) 链接:https://ac.nowcoder.co ...

随机推荐

  1. unity2D技术学习与整理

    目前有关unity2D的教程以及原理几乎都是国外的.我在这方面也是新手,看了一些例子有很多不懂的地方. 这个网站提供的教程很有参考价值 http://brackeys.com/ 还有这个 http:/ ...

  2. 玩转Linux之pwd命令

    玩转Linux之pwd命令 你有没有遇到过需要知道当前所在目录却无从得知?有没有想要复制出当前所在目录层次却不知如何下手?俗话说有困难找警察,想知道目录层次自然要找pwd了.那么问题来了: 什么是pw ...

  3. java初学4

    1.interface接口 (1)[修饰符] interface 接口名 extends 父接口1,父接口2....        •没有构造方法,不能实例化;        •接口只能继承接口,不能 ...

  4. springboot11 JPA

    一.JPA 1. JPA 介绍 JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到 ...

  5. 网络--路由表&IP选路

    路由表的 flags 字段显示路由状态: A 活动的休眠网关检测在路由上被启用.本字段只适用于 AIX 5.1 或更新版本. U :Up. H :路由至主机而不是网络. G :路由至网关. 不带G表示 ...

  6. XML快速入门

    XML是什么 Extensible Markup Language 自定义标签: 用来传输数据: 可扩展标记语言,是一种类似超文本标记语言的标记语言. 与HTML的比较: 1.不是用来替代HTML的: ...

  7. 详解Linux运维工程师应具备的十大技能

    Linux系统如果是学习可以选用Redhat或CentOS,特别是CentOS在企业中用得最多,当然还会有其它版本的,但学习者还是以这2个版本学习就行,因为这两个版本都是兄弟,没区别的,有空可以再研究 ...

  8. 在Struts等框架中获取Spring容器的方式

    WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(ServletContext src); ...

  9. JZOJ 5305 C先生

    题意: 有一个n个点,m条边的图,没有重边.自环,且每一条边最多属于一个环路. 给出q组询问,每次询问u,v两点间的路径有多少种可能. 思路: 先看下方样例说明: 由样例说明可以得知,路径上每经过一个 ...

  10. BZOJ5300 [Cqoi2018]九连环 【dp + 高精】

    题目链接 BZOJ5300 题解 这题真的是很丧病,,卡高精卡到哭 我们设\(f[i]\)表示卸掉前\(i\)个环需要的步数 那么 \[f[i] = 2*f[i - 2] + f[i - 1] + 1 ...