水池数目
时间限制: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为水池 wa了好几次 因为把m改成了n 一直wa 后来改的时候才发现 最坑爹是案例竟然过了
-
BFS
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 #define max 101 7 int map[max][max]; 8 int flag[max][max]; 9 int m,n; 10 int d[4][2]={{0,1},{-1,0},{0,-1},{1,0}}; 11 struct node 12 { 13 int x,y; 14 }; 15 16 void bfs(int i,int j) 17 { 18 queue < node >q; 19 node s,t; 20 s.x=i; 21 s.y=j; 22 q.push(s); 23 // flag[i][j]=1; 24 while (!q.empty()) 25 { 26 t=q.front(); 27 q.pop(); 28 // flag[t.x][t.y]=1; 29 for (int i=0;i<4;i++) 30 { 31 s.x=t.x+d[i][0]; 32 s.y=t.y+d[i][1]; 33 if (map[s.x][s.y]&&s.x>=0&&s.x<n&&s.y<m&&s.y>=0&&!flag[s.x][s.y]) 34 { 35 // flag[s.x][s.y]=1; 36 q.push(s); 37 } 38 flag[s.x][s.y]=1; 39 } 40 } 41 } 42 43 int main() 44 { 45 int T; 46 cin>>T; 47 while (T--) 48 { 49 cin>>n>>m; 50 int i,j; 51 for (i=0;i<n;i++) 52 for (j=0;j<m;j++) 53 scanf("%d",&map[i][j]); 54 memset(flag,0,sizeof(flag)); 55 int sum=0; 56 for (i=0;i<n;i++) 57 { 58 for (j=0;j<m;j++) 59 { 60 if (map[i][j]&&!flag[i][j]) 61 { 62 bfs(i,j); 63 sum++; 64 } 65 } 66 } 67 cout<<sum<<endl; 68 } 69 return 0; 70 }
dfs1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 #define max 101 6 int map[max][max]; 7 int flag[max][max]; 8 int m,n; 9 10 void dfs(int i,int j) 11 { 12 if (i<0||i>=n||j<0||j>=m||flag[i][j]||!map[i][j]) 13 { 14 return ; 15 } 16 flag[i][j]=1; 17 dfs(i,j+1); 18 dfs(i-1,j); 19 dfs(i,j-1); 20 dfs(i+1,j); 21 } 22 23 int main() 24 { 25 int T; 26 cin>>T; 27 while (T--) 28 { 29 cin>>n>>m; 30 int i,j; 31 for (i=0;i<n;i++) 32 for (j=0;j<m;j++) 33 scanf("%d",&map[i][j]); 34 memset(flag,0,sizeof(flag)); 35 int sum=0; 36 for (i=0;i<n;i++) 37 { 38 for (j=0;j<m;j++) 39 { 40 if (map[i][j]&&!flag[i][j]) 41 { 42 //flag[i][j]=1; 43 dfs(i,j); 44 sum++; 45 } 46 } 47 } 48 cout<<sum<<endl; 49 } 50 return 0; 51 }