nyoj 284 poj 2312 搜索之水池数目

 

水池数目

时间限制: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 }
dfs
 1 #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 }
原文地址:https://www.cnblogs.com/wujianwei/p/2609722.html