nyoj-水池问题
2017-04-16 15:50
127 查看
水池数目
时间限制:3000 ms | 内存限制:65535 KB难度:4
描述南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池。
输入第一行输入一个整数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
这是一道经典的搜索题,仔细思考应该会有思路的。
代码参考:
#include<stdio.h> #include<string.h> int map[105][105],vist[105][105]; int n,m; void dfs(int x,int y,int z) { if(x<0||y<0||x>=n||y>=m) return;//判断该点是否越界 if(vist[x][y]>0||map[x][y]!=1) return;//判断该点是否能走 vist[x][y]=1;//标记该点已走 for(int i=-1;i<2;i++) { for(int j=-1;j<2;j++) { if(i==0||j==0)//向四个方向搜索 dfs(x+i,y+j,z); } } } int main() { int t; scanf("%d",&t); while(t--) { int i,j,p=0; scanf("%d%d",&n,&m); for(i=0;i<n;i++) { for(j=0;j<m;j++) { scanf("%d",&map[i][j]); } } memset(vist,0,sizeof(vist)); for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(map[i][j]==1&&vist[i][j]==0)//判断该点能否搜索 dfs(i,j,++p); } } printf("%d\n",p); } return 0; }
相关文章推荐
- nyoj 27水池问题
- NYOJ 27水池问题
- nyoj 78 圈水池 凸包问题 篱笆问题
- NYOJ 78:圈水池 (凸包问题)
- nyoj78圈水池(凸包问题)
- NYOJ 78 圈水池(凸包问题)
- NYOJ 圈水池(凸包问题)
- NYOJ_47 过河问题,贪心选择
- NYOJ 36 最长公共子序列 【dp问题】
- NYOJ 27 水池数目
- NYOJ 42 一笔画问题
- NYOJ 38 布线问题【prim】
- NYOJ—-106题背包问题
- NYOJ 114 某种序列 【大数问题】
- NYOJ214 单调递增子序列(二) 【dp问题】
- NYOJ 311 完全背包【背包问题】
- NYOJ---38题布线问题
- nyoj95 众数问题(hash)
- NYOJ 106 背包问题
- NYOJ 14 会场安排问题