nyoj 27-水池数目(BFS, DFS)
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)的更多相关文章
- NYOJ 27.水池数目-DFS求连通块
水池数目 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...
- nyoj 27 水池数目
水池数目 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...
- nyoj27水池数目 (DFS)
题目27 题目信息 执行结果 本题排行 pid=27" style="text-decoration:none; color:rgb(55,119,188)">讨论 ...
- 水池数目(DFS)
水池数目 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...
- NYOJ题目27水池数目
--------------------------------------------- 这道题有点坑,也怪我总是有点马虎,按照正常人的思维0是表示有水池啊竟然是1表示有水池,最坑的是写反了竟然还能 ...
- nyoj水池数目
水池数目 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...
- ACM 水池数目
水池数目 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...
- acm入门搜索-水池数目
水池数目 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处 ...
- ny27 水池数目
水池数目 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上 ...
随机推荐
- [NOIp2010] luogu P1514 引水入城
跟 zzy, hwx 等人纠结是否回去上蛋疼的董老板的课. 题目描述 如图所示.你有一个 N×MN\times MN×M 的矩阵,水可以从一格流到与它相邻的格子,需要满足起点的海拔严格高于终点海拔.定 ...
- 除法分块 luogu2261 (坑)
除法分块 除法分块 是指使用分块计算的方法求S=∑i=1n⌊ki⌋S=\sum^{n}_{i=1}{\lfloor{\frac{k}{i}}\rfloor}S=i=1∑n⌊ik⌋的值. 举个例子. ...
- [LUOGU2964] [USACO09NOV]硬币的游戏A Coin Game
题目描述 Farmer John's cows like to play coin games so FJ has invented with a new two-player coin game c ...
- JZOJ5771【NOIP2008模拟】遨游
Description MWH寒假外出旅游,来到了S国.S国划分为N个省,第i个省有Ti座城市,编号分别为Ci1,Ci2,……CiTi(各省城市编号不会重复).所有城市间有M条双向的道路连接 ...
- SpringBoot项目配置Tomcat和JVM参数
设置Tomcat端口号和连接数等 使用application.properties配置文件有一些参数无法设置,所以推荐创建一个类文件来配置,如下: package com.qipai.springbe ...
- 第九周课程总结&实验报告(七)
实验任务详情: 完成火车站售票程序的模拟. 要求: (1)总票数1000张: (2)10个窗口同时开始卖票: (3)卖票过程延时1秒钟: (4)不能出现一票多卖或卖出负数号票的情况. 实验代码 pac ...
- Asp.net Core全局异常监控和记录日志
前言 系统异常监控可以说是重中之重,系统不可能一直运行良好,开发和运维也不可能24小时盯着系统,系统抛异常后我们应当在第一时间收到异常信息.在Asp.net Core里我使用拦截器 ...
- jQuery的原生替代
jQuery的原生替代,参考自你不需要jQuery,对其进行了更清晰的总结与分类,现代游览器基本都支持(ie10+以上),只整理了最简洁实用的原生代码,过分累赘的实现没有加入 元素获取 jQuery ...
- SpringBoot之配置文件的注入
@PropertySource&@ImportResource&@Bean @PropertySource:加载指定的配置文件: /** * 将配置文件中配置的每一个属性的值,映射到这 ...
- C语言存储类别和链接
目录 C语言存储类别和链接 存储类别 存储期 五种存储类别 C语言存储类别和链接 最近详细的复习C语言,看到存储类别的时候总感觉一些概念模糊不清,现在认真的梳理一下.C语言的优势之一能够让程序员恰 ...