水池数目
时间限制: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
1 #include<iostream> 2 #define max 110 3 using namespace std; 4 int s[max][max]; 5 int n,m; 6 int dir[2][4]={1,-1,0,0,0,0,-1,1};//四个方向,上,下,左,右 7 void bfs(int x,int y) 8 { 9 int i,xx,yy; 10 if(s[x][y]==1) 11 s[x][y]=0;//如果满足条件变成空地 12 for(i=0;i<4;i++) 13 { 14 xx=x+dir[0][i]; 15 yy=y+dir[1][i]; 16 if(xx<1 || xx>n || yy<1 || yy>m || s[xx][yy]==0) 17 continue;//不满足条件,结束本次循环 18 bfs(xx,yy);//采用回溯的方法 19 } 20 } 21 int main() 22 { 23 int t,sum,i,j; 24 cin>>t; 25 while(t--) 26 { 27 sum=0; 28 cin>>n>>m; 29 for( i=1;i<=n;i++) 30 for( j=1;j<=m;j++) 31 cin>>s[i][j]; 32 for(i=1;i<=n;i++) 33 for(j=1;j<=m;j++) 34 if(s[i][j]==1) 35 { 36 sum++; 37 s[i][j]=0;//如果遇见水池,就把当前位置,变成地面; 38 bfs(i,j);//然后调用 39 } 40 cout<<sum<<endl; 41 } 42 return 0; 43 }