27-水池数目

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

accepted:17
submit:22

题目描述:

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

输入描述:

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

输出描述:

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

样例输入:

复制

  1. 2
  2. 3 4
  3. 1 0 0 0
  4. 0 0 1 1
  5. 1 1 1 0
  6. 5 5
  7. 1 1 1 1 0
  8. 0 0 1 0 1
  9. 0 0 0 0 0
  10. 1 1 1 0 0
  11. 0 0 1 1 1

样例输出:

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

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

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <cmath>
  6. #include <stack>
  7. #include <map>
  8. #include <queue>
  9.  
  10. using namespace std;
  11. const int MAXN = ;
  12. int my_map[MAXN][MAXN], book[MAXN][MAXN], mov[][] = {{, }, {, }, {-, }, {, -}};
  13. struct node
  14. {
  15. int a, b;
  16. };
  17.  
  18. bool judge(node q)
  19. {
  20. if(my_map[q.a][q.b]) return true;
  21. return false;
  22. }
  23.  
  24. void bfs(int x, int y)
  25. {
  26. queue <node> Q;
  27. node q1, q2;
  28. q1.a = x, q1.b = y;
  29. Q.push(q1);
  30. while(!Q.empty())
  31. {
  32. q1 = Q.front();
  33. for(int i = ; i <= ; ++ i)
  34. {
  35. q2.a = q1.a + mov[i][];
  36. q2.b = q1.b + mov[i][];
  37. if(!judge(q2)) continue;
  38. my_map[q2.a][q2.b] = ;
  39. Q.push(q2);
  40. }
  41. Q.pop();
  42. }
  43. }
  44.  
  45. int main()
  46. {
  47. int t;
  48. scanf("%d", &t);
  49. while(t --)
  50. {
  51. int n, m, cnt = ;
  52. memset(book, , sizeof(book));
  53. scanf("%d%d", &n, &m);
  54. for(int i = ; i <= n; ++ i)
  55. for(int j = ; j <= m; ++ j)
  56. scanf("%d", &my_map[i][j]);
  57.  
  58. for(int i = ; i <= n; ++ i)
  59. {
  60. for(int j = ; j <= m; ++ j)
  61. {
  62. if(my_map[i][j])
  63. {
  64. ++ cnt;
  65. bfs(i, j);
  66. }
  67. }
  68. }
  69. printf("%d\n", cnt);
  70. }
  71. return ;
  72. }

 

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

核心代码:

  1. void dfs(int x, int y)
  2. {
  3. if(!my_map[x+mov[i][]][y+mov[i][]]) return ;
  4. for(int i = ; i <= ; ++ i)
  5. {
  6. if(book[x+mov[i][]][y+mov[i][]]) continue;
  7. book[x+mov[i][]][y+mov[i][]] = ;
  8. my_map[x+mov[i][]][y+mov[i][]] = ;
  9. dfs(x+mov[i][], y+mov[i][]);
  10. book[x+mov[i][]][y+mov[i][]] = ;
  11. }
  12. }

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

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <cmath>
  6. #include <stack>
  7. #include <map>
  8. #include <queue>
  9.  
  10. using namespace std;
  11. const int MAXN = ;
  12. int my_map[MAXN][MAXN], book[MAXN][MAXN], mov[][] = {{, }, {, }, {-, }, {, -}};
  13. struct node
  14. {
  15. int a, b;
  16. };
  17.  
  18. bool judge(node q)
  19. {
  20. if(my_map[q.a][q.b]) return true;
  21. return false;
  22. }
  23.  
  24. void dfs(int x, int y)
  25. {
  26. if(!my_map[x][y]) return;
  27. for(int i = ; i <= ; ++ i)
  28. {
  29. if(book[x+mov[i][]][y+mov[i][]]) continue;
  30. book[x+mov[i][]][y+mov[i][]] = ;
  31. my_map[x][y] = ;
  32. dfs(x+mov[i][], y+mov[i][]);
  33. book[x+mov[i][]][y+mov[i][]] = ;
  34. }
  35. }
  36.  
  37. int main()
  38. {
  39. int t;
  40. scanf("%d", &t);
  41. while(t --)
  42. {
  43. int n, m, cnt = ;
  44. memset(book, , sizeof(book));
  45. scanf("%d%d", &n, &m);
  46. for(int i = ; i <= n; ++ i)
  47. for(int j = ; j <= m; ++ j)
  48. scanf("%d", &my_map[i][j]);
  49.  
  50. for(int i = ; i <= n; ++ i)
  51. {
  52. for(int j = ; j <= m; ++ j)
  53. {
  54. if(my_map[i][j])
  55. {
  56. ++ cnt;
  57. dfs(i, j);
  58. }
  59. }
  60. }
  61. printf("%d\n", cnt);
  62. }
  63. return ;
  64. }
  1.  

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. [NOIp2010] luogu P1514 引水入城

    跟 zzy, hwx 等人纠结是否回去上蛋疼的董老板的课. 题目描述 如图所示.你有一个 N×MN\times MN×M 的矩阵,水可以从一格流到与它相邻的格子,需要满足起点的海拔严格高于终点海拔.定 ...

  2. 除法分块 luogu2261 (坑)

    除法分块 除法分块 是指使用分块计算的方法求S=∑i=1n⌊ki⌋S=\sum^{n}_{i=1}{\lfloor{\frac{k}{i}}\rfloor}S=i=1∑n​⌊ik​⌋的值. 举个例子. ...

  3. [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 ...

  4. JZOJ5771【NOIP2008模拟】遨游

    Description      MWH寒假外出旅游,来到了S国.S国划分为N个省,第i个省有Ti座城市,编号分别为Ci1,Ci2,……CiTi(各省城市编号不会重复).所有城市间有M条双向的道路连接 ...

  5. SpringBoot项目配置Tomcat和JVM参数

    设置Tomcat端口号和连接数等 使用application.properties配置文件有一些参数无法设置,所以推荐创建一个类文件来配置,如下: package com.qipai.springbe ...

  6. 第九周课程总结&实验报告(七)

    实验任务详情: 完成火车站售票程序的模拟. 要求: (1)总票数1000张: (2)10个窗口同时开始卖票: (3)卖票过程延时1秒钟: (4)不能出现一票多卖或卖出负数号票的情况. 实验代码 pac ...

  7. Asp.net Core全局异常监控和记录日志

    前言           系统异常监控可以说是重中之重,系统不可能一直运行良好,开发和运维也不可能24小时盯着系统,系统抛异常后我们应当在第一时间收到异常信息.在Asp.net Core里我使用拦截器 ...

  8. jQuery的原生替代

    jQuery的原生替代,参考自你不需要jQuery,对其进行了更清晰的总结与分类,现代游览器基本都支持(ie10+以上),只整理了最简洁实用的原生代码,过分累赘的实现没有加入 元素获取 jQuery ...

  9. SpringBoot之配置文件的注入

    @PropertySource&@ImportResource&@Bean @PropertySource:加载指定的配置文件: /** * 将配置文件中配置的每一个属性的值,映射到这 ...

  10. C语言存储类别和链接

    目录 C语言存储类别和链接 存储类别 存储期 五种存储类别 C语言存储类别和链接 ​ 最近详细的复习C语言,看到存储类别的时候总感觉一些概念模糊不清,现在认真的梳理一下.C语言的优势之一能够让程序员恰 ...