时间限制: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. C#中窗体、MDI的使用心得

    1、Show()和ShowDialog()的差别,前者在执行之后,无需等待返回,多用于MDI窗体的显示(MDI窗体之间是并列的,可以随时切换,需要注意自己调整的页面的需求,是要并列,还是要等待其中一个 ...

  2. 图解-Excel的csv格式特殊字符处理方式尝试笔记(个人拙笔)

    Excel格式如下.(截图来自,WPS Office) CSV是一种文本格式的Excel文档格式.不支持Excel的字体特效(比如加粗,颜色)等等的保存. 每一行数据用 "\n" ...

  3. jQuery easyuI datagrid 多行编辑

    在easyUI 动态绑定部分数据后,需要有部分列可以修改,研究了一天终于搞定.这是小弟的做法,望各位有好招的大侠指点. 1.添加jQuery 和jQuery easyuI的引用. 2.添加id为tt的 ...

  4. 数据库——pymysql模块的使用(13)

    1.基本用法——建立链接,获取游标,执行sql语句,关闭 建立远程链接账号和权限 mysql> grant all on *.* to '; Query OK, rows affected, w ...

  5. Python全栈工程师(文件操作、编码)

    ParisGabriel                每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰     Python人工智能从入门到精通 最近简直要死了 发烧感冒 喉咙痛..... ...

  6. 台州学院maximum cow训练记录

    前队名太过晦气,故启用最大牛 我们的组队大概就是18年初,组队阵容是17级生詹志龙.陶源和16级的黄睿博. 三人大学前均无接触过此类竞赛,队伍十分年轻.我可能是我们队最菜的,我只是知道的内容最多,靠我 ...

  7. stack,heap的区别

    一个由C/C++编译的程序占用的内存分为以下几个部分    1.栈区(stack)—   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等.其    操作方式类似于数据结构中的栈.    ...

  8. PHP可变变量的简单使用

    知识点: 可变变量:简单说就是将一个变量的值用作另外一个变量的命名上,例如$a = 'b';$$a就是$b HTML代码: <!doctype html> <html> < ...

  9. jquery radio 行选中 操作

    想实现点击一行中任意位置 此行的 radio 选中. function rowClick(t) { var id = $(t).attr("id").substr(3, 1); / ...

  10. Python中的多线程编程,线程安全与锁(二)

    在我的上篇博文Python中的多线程编程,线程安全与锁(一)中,我们熟悉了多线程编程与线程安全相关重要概念, Threading.Lock实现互斥锁的简单示例,两种死锁(迭代死锁和互相等待死锁)情况及 ...