27-水池数目

内存限制:64MB
时间限制:3000ms
Special Judge: No

accepted:17
submit:22

题目描述:

南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池。

输入描述:

第一行输入一个整数N,表示共有N组测试数据
每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水池,0表示此处是地面)

输出描述:

输出该地图中水池的个数。
要注意,每个水池的旁边(上下左右四个位置)如果还是水池的话的话,它们可以看做是同一个水池。

样例输入:

复制

2
3 4
1 0 0 0
0 0 1 1
1 1 1 0
5 5
1 1 1 1 0
0 0 1 0 1
0 0 0 0 0
1 1 1 0 0
0 0 1 1 1

样例输出:

2
3 分析1(BFS):
  ①、该题即就是看独立的1的堆数有多少
  ②、根据BFS的思想,将数据为1的每层数据变为0后,向下一层遍历,以递推的思想将每一个1都变为0 步骤:
  ①、用BFS遍历模板完成数据1的遍历及修改 核心代码:
  
 void bfs(int x, int y)
{
queue<node> Q;
node q1, q2;
q1.a = x, q1.b = y;
Q.push(q1);
while(!Q.empty())
{
q1 = Q.front();
for(int i = ; i <= ; ++ i)
{
q2.a = q1.a + mov[i][];
q2.b = q2.b + mov[i][];
if(!my_map[q2.a][q2.b]) continue;
my_map[q2.a][q2.b] = ;
Q.push(q2);
}
Q.pop();
}
}

C/C++代码实现(AC):

 #include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <stack>
#include <map>
#include <queue> using namespace std;
const int MAXN = ;
int my_map[MAXN][MAXN], book[MAXN][MAXN], mov[][] = {{, }, {, }, {-, }, {, -}};
struct node
{
int a, b;
}; bool judge(node q)
{
if(my_map[q.a][q.b]) return true;
return false;
} void bfs(int x, int y)
{
queue <node> Q;
node q1, q2;
q1.a = x, q1.b = y;
Q.push(q1);
while(!Q.empty())
{
q1 = Q.front();
for(int i = ; i <= ; ++ i)
{
q2.a = q1.a + mov[i][];
q2.b = q1.b + mov[i][];
if(!judge(q2)) continue;
my_map[q2.a][q2.b] = ;
Q.push(q2);
}
Q.pop();
}
} int main()
{
int t;
scanf("%d", &t);
while(t --)
{
int n, m, cnt = ;
memset(book, , sizeof(book));
scanf("%d%d", &n, &m);
for(int i = ; i <= n; ++ i)
for(int j = ; j <= m; ++ j)
scanf("%d", &my_map[i][j]); for(int i = ; i <= n; ++ i)
{
for(int j = ; j <= m; ++ j)
{
if(my_map[i][j])
{
++ cnt;
bfs(i, j);
}
}
}
printf("%d\n", cnt);
}
return ;
}

 

分析2(DFS):
  用DFS只是在处理遍历方式有点不同,dfs是属于一条路走到底的走法

核心代码:

 void dfs(int x, int y)
{
if(!my_map[x+mov[i][]][y+mov[i][]]) return ;
for(int i = ; i <= ; ++ i)
{
if(book[x+mov[i][]][y+mov[i][]]) continue;
book[x+mov[i][]][y+mov[i][]] = ;
my_map[x+mov[i][]][y+mov[i][]] = ;
dfs(x+mov[i][], y+mov[i][]);
book[x+mov[i][]][y+mov[i][]] = ;
}
}

C/C++代码实现(AC):

 #include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <stack>
#include <map>
#include <queue> using namespace std;
const int MAXN = ;
int my_map[MAXN][MAXN], book[MAXN][MAXN], mov[][] = {{, }, {, }, {-, }, {, -}};
struct node
{
int a, b;
}; bool judge(node q)
{
if(my_map[q.a][q.b]) return true;
return false;
} void dfs(int x, int y)
{
if(!my_map[x][y]) return;
for(int i = ; i <= ; ++ i)
{
if(book[x+mov[i][]][y+mov[i][]]) continue;
book[x+mov[i][]][y+mov[i][]] = ;
my_map[x][y] = ;
dfs(x+mov[i][], y+mov[i][]);
book[x+mov[i][]][y+mov[i][]] = ;
}
} int main()
{
int t;
scanf("%d", &t);
while(t --)
{
int n, m, cnt = ;
memset(book, , sizeof(book));
scanf("%d%d", &n, &m);
for(int i = ; i <= n; ++ i)
for(int j = ; j <= m; ++ j)
scanf("%d", &my_map[i][j]); for(int i = ; i <= n; ++ i)
{
for(int j = ; j <= m; ++ j)
{
if(my_map[i][j])
{
++ cnt;
dfs(i, j);
}
}
}
printf("%d\n", cnt);
}
return ;
}

nyoj 27-水池数目(BFS, DFS)的更多相关文章

  1. NYOJ 27.水池数目-DFS求连通块

    水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...

  2. nyoj 27 水池数目

    水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...

  3. nyoj27水池数目 (DFS)

    题目27 题目信息 执行结果 本题排行 pid=27" style="text-decoration:none; color:rgb(55,119,188)">讨论 ...

  4. 水池数目(DFS)

    水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...

  5. NYOJ题目27水池数目

    --------------------------------------------- 这道题有点坑,也怪我总是有点马虎,按照正常人的思维0是表示有水池啊竟然是1表示有水池,最坑的是写反了竟然还能 ...

  6. nyoj水池数目

    水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...

  7. ACM 水池数目

    水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...

  8. acm入门搜索-水池数目

    水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处 ...

  9. ny27 水池数目

    水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上 ...

随机推荐

  1. Drive Scope Mac硬盘检查分析神器

    Drive Scope Mac硬盘检查分析神器 硬盘驱动器(和固态驱动器)是Mac中最容易出故障的组件.出于这个原因,事实上,驱动器制造商已将自我监控,分析和报告技术内置于驱动器中.(又名SMART) ...

  2. 元素定位之css选择器(2)

    理论学习地址:https://www.runoob.com/cssref/css-selectors.html 定位思路: 先在单元素范围内选择查找id或name,定位不到的话往上查扩大范围 使用实例 ...

  3. 利用Arthas定位线上问题实例

    前言 Arthas是一个类似于Btrace的JVM在线调试分析工具,具体可参考我之前写的一篇博客:利用JVM在线调试工具排查线上问题.本文分享笔者刚遇到的一个问题,虽然不复杂,但是很典型. 问题与分析 ...

  4. Airflow速用

    Airflow是Apache用python编写的,用到了 flask框架及相关插件,rabbitmq,celery等(windows不兼容):. 主要实现的功能 编写 定时任务,及任务间的编排: 提供 ...

  5. CSS(1)---css语法、css选择器

    CSS(1)---css语法.css选择器 一.CSS语法 1.CSS语法 CSS 规则由两个主要的部分构成:选择器以及一条或多条声明. 属性 是您希望设置的 样式属性.每个属性有一个属性值.属性和属 ...

  6. javascript函数前面加~波浪线的作用

    如下,在函数前加上波浪号,其作用是把函数声明转换为表达式,这样就可以直接运行. ~function sayHello(){ console.log('hello'); }() 测试: 在console ...

  7. Log4j slf4j 配置简单介绍

    Log4j slf4j 配置简单介绍 先借鉴一篇很好的文章 为什么要使用SLF4J而不是Log4J import org.slf4j.Logger; import org.slf4j.LoggerFa ...

  8. 文件的处理(day09整理)

    目录 昨日回顾 二十八.字符编码 1.什么是字符编码 2.字符编码的发展史 3.gbk和gb2312 二十九.python2和python3的区别 python解释器启动的流程 今日内容 三十.文件处 ...

  9. OptimalSolution(1)--递归和动态规划(1)斐波那契系列问题的递归和动态规划

    一.斐波那契数列 斐波那契数列就是:当n=0时,F(n)=0:当n=1时,F(n)=1:当n>1时,F(n) = F(n-1)+F(n-2). 根据斐波那契数列的定义,斐波那契数列为(从n=1开 ...

  10. 数据结构(三十三)最小生成树(Prim、Kruskal)

    一.最小生成树的定义 一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边. 在一个网的所有生成树中,权值总和最小的生成树称为最小代价生成树(Minimum ...