类似八连块问题
题意:如果上下左右其中有‘#’ 则它们属于一个羊群,只需对每一个格子dfs访问它的上下左右就行了。
#include<cstdio>
#include<cstring>
int map[111][111];
bool vis[111][111];
int n,m;
void dfs(int x,int y)
{
if(vis[x][y]||!map[x][y]) return;
vis[x][y]=1;
dfs(x-1,y);
dfs(x,y-1); dfs(x,y+1);
dfs(x+1,y);
}
int main()
{
int t;
char a[111];
scanf("%d",&t);getchar();
while(t--)
{
int ans=0;
memset(map,0,sizeof(map));
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&m);
getchar();
for(int i=1;i<=n;i++)
{
gets(a);
for(int j=0;j<m;j++)
{
if(a[j]=='#')
map[i][j+1]=1;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(!vis[i][j]&&map[i][j])
{
ans++;
dfs(i,j);
}
}
printf("%d\n",ans);
}
return 0;
}