石油探测(DFS)

题目

Description
地质探测公司负责探测地下石油资源,每次在一块矩形的区域上查找。探测人员用把这块矩形区域分成 了N X M个正方形小块,然后对每个正方形小块分别进行分析,经过分析之后,为每个小块都做了一个标记,如果一个小块地下发现有石油,则用“@”标记,否则用”.标记”。如果两个含有石油的小块是相邻的,那么它们属于同一块石油地,这里的相邻包括水平,垂直,或者对角相邻。给定一块已经标记过的矩形区域,你的任务是找出这块区域上的石油地的个数

Input
本题有多组输入数据。对于每一组输入数据,第一行输入两个数M,N,(1<=M,N<=100),接下来是M行,每行含有N个字符,每个字符要么是“@”,要么是”*”。

Output
对于每组数据,输出一行,包含一个整数,它表示石油的地块数

Sample Input
Original Transformed
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5 
****@
*@@*@
*@**@
@@@*@
@@**@
0 0

Sample Output
Original Transformed
0
1
2
2

分析:直接dfs把相连的@全部变成*。

代码

#include<iostream>
#include<cstdio>
#include<queue>
#include<string>
#include<cstring>
using namespace std;
int book[120][120],sum
int next1[8][2]={{1,0},{0,1},{-1,0},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
char num[120][120];
int n,m;
void dfs(int x,int y)
{
    int tx,ty;
    num[x][y]='*';
    for(int k=0;k<8;k++)
    {
        tx=x+next1[k][0];
        ty=y+next1[k][1];
        if(tx<0||tx>=n||ty<0||ty>=m)
            continue;
        if(num[tx][ty]=='@'&&book[tx][ty]==0)
        {
            book[tx][ty]=1;
            dfs(tx,ty);
        }
    }
    return ;
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        sum=0;
        memset(book,0,sizeof(book));
        for(int i=0;i<n;i++)
            scanf("%s",num[i]);
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(num[i][j]=='@')
                {
                    sum++;
                    book[i][j]=1;
                    dfs(i,j);
                }
       printf("%d\n",sum);
    }
    return 0;
}



posted @ 2016-07-10 17:12  Nickqiao  阅读(507)  评论(0编辑  收藏  举报