nyoj27水池数目
来源:互联网 发布:人工智能炒作逻辑 编辑:程序博客网 时间:2024/03/29 18:18
很久之前就刷过了这道题,差不多是开始学习搜索刷过的最早的题目,用的是深搜。今天做幸运三角形的时候发现深搜都快忘没了(ps:还是有点小健忘啊),所以就过来复习一下,想着写下深搜的定义,百度就可以了,所以就用复习题目的方式来学习喽~~
水池数目
时间限制:3000 ms | 内存限制:65535 KB
难度:4
- 描述
- 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池。
- 输入
- 第一行输入一个整数N,表示共有N组测试数据
每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水池,0表示此处是地面) - 输出
- 输出该地图中水池的个数。
要注意,每个水池的旁边(上下左右四个位置)如果还是水池的话的话,它们可以看做是同一个水池。 - 样例输入
23 41 0 0 0 0 0 1 11 1 1 05 51 1 1 1 00 0 1 0 10 0 0 0 01 1 1 0 00 0 1 1 1
- 样例输出
23
所谓深度优先搜索,还是我自己的理解,就是所有的方向一个一个的搜,沿着树的深度遍历节点,尽可能深的搜索树。找到一张图图。
这样就很好理解了~其中往下搜索是用的递归(或者用栈去实现),而且有的要记得取消标记,因为递归会返回,也就是回溯。。
好了,回到题目。
#include <stdio.h>#include <stdlib.h>int num[102][102];int L = 0; //L用来记录水池的个数void fun(int p, int q) //下面就是从是水池的那一点开始找它的上下左右,是水池的就标记成0,然后向下递归{ if(num[p+1][q] == 1) { num[p+1][q] = 0; fun(p+1, q); } if(num[p-1][q] == 1) { num[p-1][q] = 0; fun(p-1, q); } if(num[p][q-1] == 1) { num[p][q-1] = 0; fun(p, q-1); } if(num[p][q+1] == 1) { num[p][q+1] = 0; fun(p, q+1); }}int main(){ int n; scanf("%d", &n); int a,b; int i, j; while( n-- ) { L = 0; scanf("%d%d", &a, &b); for(i=1; i<=a; i++) { for(j=1; j<=b; j++) //搜的时候需要留下边界,防止搜过,so~从1开始 { scanf("%d", &num[i][j]); //构造水池和地面~也就是地图了 } } for(i=1; i<=a; i++) { for(j=1; j<=b; j++) { if(num[i][j] == 1) { L++; //搜到水池,L++,让其标记成0 ,然后开始递归。 num[i][j] = 0; fun(i, j); } } } printf("%d\n", L); } return 0;}
哦可~~
贴最优代码
#include <stdio.h>#define N 102#define M 102int map[N][M];void search(int i,int j){ if(map[i][j-1]) { map[i][j-1]=0; search(i,j-1); } if(map[i][j+1]) { map[i][j+1]=0; search(i,j+1); } if(map[i-1][j]) { map[i-1][j]=0; search(i-1,j); } if(map[i+1][j]) { map[i+1][j]=0; search(i+1,j); }}int main(){ int t,n,m; int i,j,count; scanf("%d",&t); while(t--) { scanf("%d %d",&n,&m); count=0; for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&map[i][j]); for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(map[i][j]) { count++; map[i][j]=0; search(i,j); } printf("%d\n",count); } return 0;}短小精悍。。。。。
0 0
- nyoj27 水池数目 dfs
- NYOJ27 水池数目
- NYOJ27-水池数目
- NYOJ27,水池数目
- nyoj27水池数目
- nyoj27 水池数目
- NYOJ27 水池数目
- nyoj27水池数目
- nyoj27---水池数目
- nyoj27 水池数目
- NYOJ27水池数目
- NYOJ27 水池数目 BFS
- nyoj27 水池数目
- nyoj27 水池数目
- nyoj27水池数目 (DFS)
- NYOJ27水池数目(dfs)
- NYOJ27 水池数目(深搜DFS)
- NYOJ27水池数目(dfs)
- 第13周项目5-字符串操作-(2.1)
- AIX crontab 0403-027 The parameter list is too long 参数过长报错
- android 很多牛叉布局github地址
- CSS技术学会需要多长时间 div精通需要多长时间?
- python调用mongodb选取部分属性
- nyoj27水池数目
- 1017. A除以B (20) (数学啊 ZJU_PAT)
- Eclipse中10个最有用的快捷键组合
- LEFT JOIN 或 RIGHT JOIN 在GROUP BY 下如何利用COUNT统计有NULL的行
- SuSE Linux常见日志清单
- LINQ的基本语法介绍
- Hadoop-Yarn安装部署
- KAFKA分布式消息系统 <转>
- ios UITableView划动删除的实现