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. iOS开发请您把握现在 — 面向未来学习

    iOS开发请您把握现在 — 面向未来学习 这一篇文章,如果你是一名iOS开发正好也处于开发晋升瓶颈迷茫期,不妨停下你的脚步,花五分钟看看,兴许有你需要的!文章结尾有彩蛋 群里常见的唱哀 iOS现在到底 ...

  2. java 线程池那点事儿

    1.为什么要用线程池 2.常见线程池以及参数 2.1 创建线程池 2.2 线程池参数 2.3 常见线程池 3.执行流程 4.健康检查 1.为什么要用线程池 线程池提供了一种任务的提交与任务的执行解偶的 ...

  3. spring boot 中的路径映射

    在spring boot中集成thymeleaf后,我们知道thymeleaf的默认的html的路径为classpath:/templates也就是resources/templates,那如何访问这 ...

  4. rabbitmq学习-如何安装rabbitmq

    学习当然还是需要看官网地址的哈 官网地址 你可能会说老铁,看不懂英文咋办?我只能说各大翻译软件以及广大网友总有一款是你喜欢的 广大网友翻译的 中文文档 什么是rabbitmq? rabbitmq (R ...

  5. 【从刷面试题到构建知识体系】Java底层-synchronized锁-2偏向锁篇

    上一篇通过构建金字塔结构,来从不同的角度,由浅入深的对synchronized关键字做了介绍, 快速跳转:https://www.cnblogs.com/xyang/p/11631866.html 本 ...

  6. 【IntelliJ IDEA】 常用快捷键列表

    1.常用Shortcut F2 或Shift+F2 高亮错误或警告快速定位 Ctrl+Up/Down 光标跳转到第一行或最后一行下 Ctrl+B 快速打开光标处的类或方法  CTRL+ALT+B  找 ...

  7. phpstudy 升级mysql到mysql5.7

    前言 今天在工作发现一个错误,在往本地导数据表的时候老是报错: ? 1 [Err] 1294 - Invalid ON UPDATE clause for '字段名' column 报错的数据表字段: ...

  8. Java8系列 (六) 新的日期和时间API

    概述 在Java8之前, 我们一般都是使用 SimpleDateFormat 来解析和格式化日期时间, 但它是线程不安全的. @Test public void test() { SimpleDate ...

  9. oracle数据库锁表,什么SQL引起了锁表?ORACLE解锁的方法

    --查询数据库锁表记录 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.l ...

  10. C函数库ctype.h概况

    1 字符测试函数 1> 函数原型均为int isxxxx(int) 2> 参数为int, 任何实参均被提升成整型 3> 只能正确处理处于[0, 127]之间的值 2 字符映射函数 1 ...