Oil Deposits
输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻(横、竖或者对角线方向),就说它们属于同一个八连块。
Sample Input
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
Sample Output
0
1
2
2
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
char c[108][108];
int a[8][2]={ {-1,0},{1,0},{0,-1},{0,1},{1,1},{-1,-1},{1,-1},{-1,1}}; //8个方向
int n,m;
bool go(int sx,int sy)
{
if(0<=sx&&sx<n&&0<=sy&&sy<m&&c[sx][sy]=='@')//可以前进
return true;
return false;
}
void dfs(int x,int y)
{
c[x][y]='*';
int i,x1,y1;
for(i=0;i<8;i++)
{
x1=x+a[i][0];
y1=y+a[i][1];
if(go(x1,y1))
{
dfs(x1,y1);
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
int i,j,ans=0;
for(i=0;i<n;i++)
{
scanf("%s",c[i]);
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(c[i][j]=='@')
{
dfs(i,j);
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}