石油探测(DFS)

来源:互联网 发布:常州淘宝网络公司 编辑:程序博客网 时间:2024/06/10 07:35

题目

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

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

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

Sample Input
OriginalTransformed
1 1*3 5*@*@***@***@*@*1 8@@****@*5 5 ****@*@@*@*@**@@@@*@@@**@0 0

Sample Output
OriginalTransformed
0122

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

代码

#include<iostream>#include<cstdio>#include<queue>#include<string>#include<cstring>using namespace std;int book[120][120],sumint 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;}


0 0
原创粉丝点击