问题描述:
GeoSurvComp地质调查公司负责检测地下油藏.GeoSurvComp一次与一个大的矩形区域一起工作,并创建一个网格,将网格划分为多个方块.然后分别分析每个地块,使用传感设备确定该地块是否含有油.含油的情节被称为口袋.如果两个口袋相邻,则它们是同一个油藏的一部分.油藏可能相当大,可能含有大量的口袋.你的工作是确定网格中包含多少个不同的油藏.
输入:
输入文件包含一个或多个网格.每个网格以含有m和n的行开始,网格中的行和列的数量由一个空格分隔.如果m=0,则表示输入结束;否则1<=m<=100且1<=n<=100。之后是每行n个字符的m行(不包括行尾字符)。每个字符对应一个图,并且代表没有油的‘*’或代表油袋的‘@’.
输出:
对于每个电网,输出不同油量的数量.如果两个不同的口袋是水平,垂直或对角相邻的,则它们是同一个油藏的一部分.一个油藏不会超过100个口袋.
需将油藏附近的油藏替换掉。
#include<bits/stdc++.h>
using namespace std;
int n,m;
char mapp[101][101];
int dir[8][2]={{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};
void dfs(int x,int y){
if(mapp[x][y]=='@')
mapp[x][y]='*';
for(int i=0;i<8;i++){
int a=dir[i][0]+x;
int b=dir[i][1]+y;
if(mapp[a][b]=='@'&&a<n&&a>=0&&b<m&&b>=0)
dfs(a,b);
}
}
int main(){
while(scanf("%d %d",&n,&m)&&n!=0&&m!=0){
int sum=0;
getchar();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%c",&mapp[i][j]);
}
getchar();
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mapp[i][j]=='@')
{
dfs(i,j);
sum++;
}
}
}
cout<<sum<<endl;
}
return 0;
}