问题描述
GeoSurvComp地质调查公司负责检测地下石油资源。GeoSurvComp发现一个大矩形区域的土地,并创建一个网格,将土地划分为许多块地。然后分别分析每一块土地,使用传感设备来确定是否包含石油。一块含有石油的土地被称为油地。如果相邻的油地,那么它们是同一油地的一部分。石油资源可能很大,可能包含众多的油地。你的工作是确定有多少不同的油地都包含在一个网格。
输入
输入文件包含一个或多个样例。每个样例的第一行包含m和n,网格中的行和列的数量,由一个空格隔开。如果m = 0,表示输入结束,否则1<=m,n<=100。随后是m行字符,每行字符有n列。每个字符对应一块土地,要么是“*”,表示没有石油,或“@”,代表油地。
输出
对于每一个样例,输出不同的油地的数量。如果两块油地垂直,水平,倾斜着相邻,算作同一块油地。所有的油地数量不超过100个。
样例输入
1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0
样例输出
0 1 2 2
题目是直接用有道在线翻译的,比较生硬。
这道题是标准的图论搜索题,用DFS可解
代码如下
#include<cstdio>
#include<cstring>
char a[105][105];
bool c[105][105];
int dir[8][2]={{1,1},{1,-1},{0,1},{0,-1},{-1,1},{-1,-1},{1,0},{-1,0}};
dfs(int i,int j,int m,int n)
{
int k,di,dj;
for(k=0;k<8;k++)
{
di=dir[k][0]+i;
dj=dir[k][1]+j;
if(di>=0&&di<m&&dj>=0&&dj<n&&a[di][dj]=='@'&&!c[di][dj])
{
c[di][dj]=true;
dfs(di,dj,m,n);
}
}
}
int main()
{
int m,n,i,j,num;
while(scanf("%d %d",&m,&n)&&m&&n)
{
getchar();
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%c",&a[i][j]);
}
getchar();
}
memset(c,0,sizeof(c));
num=0;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]=='@'&&!c[i][j])
{
c[i][j]=true;
dfs(i,j,m,n);
num++;
}
}
}
printf("%d\n",num);
}
}