输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数。如果两个黑格子有公共边或者公共顶点,就说他们属于同一个八连块。
样例输入:
6
100100
001010
000000
110000
111000
010100
样例输出:
3
遍历每一块黑色格子,以这块黑色格子为中心向四周搜索,如果被访问过则停止搜索(即vis[i][j]=1)。
#include <stdio.h>
#include <memory.h>
#include <string.h>
int mat[100][100],vis[100][100];
char s[100];
void dfs(int i,int j)
{
if(vis[i][j]||mat[i][j]==0) return ;
vis[i][j]=1;
dfs(i-1,j-1);dfs(i-1,j);dfs(i-1,j+1);
dfs(i,j-1); dfs(i,j+1);
dfs(i+1,j-1); dfs(i+1,j);dfs(i+1,j+1);
}
int main (void)
{
// freopen("黑白图像.txt","r",stdin);
int i,j,n,count;
while(scanf("%d",&n)!=EOF)
{
memset(mat,0,sizeof(mat));
memset(vis,0,sizeof(vis));
count=0;
for(i=1;i<=n;i++)
{
scanf("%s",s);
for(j=1;j<=n;j++)
{
mat[i][j]=s[j-1]-'0';
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(mat[i][j]&&vis[i][j]==0)
{
count++;
dfs(i,j);
}
}
}
printf("%d\n",count);
}
return 0;
}