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 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上 ...
随机推荐
- Ubuntu 终端中文回显乱码
参考文章 : http://wiki.ubuntu.org.cn/%E4%BF%AE%E6%94%B9locale 所用 Ubuntu的版本 : 猜想是这样的: 1.字符的编码和显示时,所处的环境不是 ...
- PHP array_pop
1.函数的作用:删除数组的最后一个元素并返回 2.函数的参数: @params array &$array 3.注意点: 每次调用之后,重置指针 4.例子: <?php $product ...
- [JOYOI1463] 智商问题
题目限制 时间限制 内存限制 评测方式 题目来源 1500ms 131072KiB 标准比较器 Local 题目背景 各种数据结构帝~ 各种小姊妹帝~ 各种一遍AC帝~ 来吧! 题目描述 某个同学又有 ...
- SpringBoot系列:Spring Boot集成Spring Cache,使用EhCache
前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache.RedisCache.ConcurrentMapCac ...
- 数据结构1_java---单链表的操作,约瑟夫问题
我们经常实用c++来建立链表,为了学习的方便,此处我使用java实现了对链表的增删改查功能 整个过程较为简单.仅供参考 流程: (1)通过内部类Node建立结点,内部变量作为指针域和数据域,并写下构造 ...
- Vuex使用总结
Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. Vuex的五个核心概念 ...
- odoo联调
odoo联调(剑飞花 373500710) 1.准备工作 1.1.参考文章“odoo8.0+PyCharm4.5开发环境配置”配置好odoo开发环境 1.2.下载Chrome浏览器,安装. 1.3.下 ...
- LeetCode初级算法--设计问题01:Shuffle an Array (打乱数组)
LeetCode初级算法--设计问题01:Shuffle an Array (打乱数组) 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:h ...
- PHPStorm IntelliJ IDEA 代码缩进风格设置
关于缩进风格,我还是觉得4空格比tab好 File -> Settings -> Editor -> Code Style: 如图,把Detect and use exsiting ...
- js循环和调用
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...