题目:
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;
}