多组案例,每组案例输入一个m行n列的字符矩阵,统计字符'@'组成多少个连通块。如果两个字符'@'所在的格子相邻(横、竖或对角线),则说明它们属于同一连通块。
案例:
Sample Input
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
Sample Output
0
1
2
2
//#include<bits/stdc++.h>
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
#include<cstdio>
typedef long long ll;
using namespace std;
int m,n;
char a[100][100];
int jud[100][100];
void dfs(int x,int y)
{
if(jud[x][y]==1||a[x][y]!='@')
return;
if(x<0||x>=m||y>=n||y<0)
return;
++jud[x][y];
for(int i=-1;i<=1;++i)
{
for(int j=-1;j<=1;++j)
{
if(i!=0||j!=0)
dfs(x+i,y+j);
}
}
}
int main()
{
while(cin>>m>>n)
{
if(m==0&&n==0)
break;
int sum=0;
getchar();
memset(jud,0,sizeof(jud));
for(int i=0;i<m;++i)
{
for(int j=0;j<n;++j)
{
cin>>a[i][j];
if(j==n-1)
getchar();
}
}
for(int i=0;i<m;++i)
for(int j=0;j<n;++j)
if(jud[i][j]==0&&a[i][j]=='@')
{
++sum;
dfs(i,j);
}
cout<<sum<<endl;
}
return 0;
}