NYIST27 水池数目

水池数目

描述
南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池。
输入
第一行输入一个整数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

这道题是简单的DFS,在每次搜索时进行+1,水题,下边是代码

#include<cstdio>
#include<cstring>
#define maxn 105

int m,n,sum;
int a[maxn][maxn];
int vis[maxn][maxn]; //标记数组,如果这点没有遍历过,为0,如果遍历过,则为1

void dfs(int r,int c)
{
    if(r<0 || r>=m|| c<0 || c>=n) return; //如果这点超过边界,return
    if( (vis[r][c] )|| (!a[r][c]) ) return;   // 如果这点遍历过或这点不是水池,return
    if((!vis[r][c]) && (a[r][c])) vis[r][c]=1;  //若这点是水池,并且没有搜索过,修改为已搜索
    dfs(r+1,c);     //
    dfs(r-1,c);      //      进行四个方向的搜索
    dfs(r,c+1);     //
    dfs(r,c-1);     //
}

int main()
{
    int N;
    scanf("%d",&N);
    while(N--)
    {
        sum=0;
        memset(vis,0,sizeof(vis));  //先把标记数组全部记为0,即全部未搜索过,
        scanf("%d%d",&m,&n);
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
                scanf("%d",&a[i][j]);
        }
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if ((!vis[i][j]) &&(a[i][j]) )   //如果这点没有搜索过,且这点为水池,就从这李开始
                {
                    sum++;       //数目加一
                    dfs(i,j);        //进行搜索
                }
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}
 
 

你可能感兴趣的:(DFS)