描述
输入一个n×n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数。如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块。如下图所示的图形有3个八连块。

输入
第1行输入一个正整数n(n≤700),此后输入n行,每行是由n个0或1组成的字符串。
输出
在输入黑白图像中,八连块的个数
样例输入
6
100100
001010
000000
110000
111000
010100
样例输出
3
#include<iostream>
#include<deque>
#include<math.h>
#include<string>
#define PI 4.0*atan(1.0)
#define MAX_32_INT
#define MAX_64_INT
#define max a>=b?(a):(b)
#define min a<b?(a):(b)
using namespace std;
#define MAX 1001
int flag[MAX][MAX];
int temp[MAX][MAX];
struct node
{
int x;
int y;
};
deque <struct node *>S;
int f(const void *a,const void *b)
{
return 1 ;
}
void bfs(int a,int b)
{
struct node *p;
p=new struct node;
p->x=a;
p->y=b;
temp[a][b]=0;
S.push_back(p);
while(S.size()>0)
{
struct node *p1;
p1=new struct node;
struct node *p2;
p1=S.front();
temp[p1->x][p1->y]=0;
S.pop_front();
if(!flag[p1->x-1][p1->y]&&temp[p1->x-1][p1->y])
{
p2=new struct node;
p2->x=p1->x-1;
p2->y=p1->y;
flag[p2->x][p2->y]=1;
temp[p2->x][p2->y]=0;
S.push_back(p2);
}
if(!flag[p1->x-1][p1->y+1]&&temp[p1->x-1][p1->y+1])
{
p2=new struct node;
p2->x=p1->x-1;
p2->y=p1->y+1;
flag[p2->x][p2->y]=1;
temp[p2->x][p2->y]=0;
S.push_back(p2);
}
if(!flag[p1->x][p1->y+1]&&temp[p1->x][p1->y+1])
{
p2=new struct node;
p2->x=p1->x;
p2->y=p1->y+1;
flag[p2->x][p2->y]=1;
temp[p2->x][p2->y]=0;
S.push_back(p2);
}
if(!flag[p1->x+1][p1->y+1]&&temp[p1->x+1][p1->y+1])
{
p2=new struct node;
p2->x=p1->x+1;
p2->y=p1->y+1;
flag[p2->x][p2->y]=1;
temp[p2->x][p2->y]=0;
S.push_back(p2);
}
if(!flag[p1->x+1][p1->y]&&temp[p1->x+1][p1->y])
{
p2=new struct node;
p2->x=p1->x+1;
p2->y=p1->y;
flag[p2->x][p2->y]=1;
temp[p2->x][p2->y]=0;
S.push_back(p2);
}
if(!flag[p1->x+1][p1->y-1]&&temp[p1->x+1][p1->y-1])
{
p2=new struct node;
p2->x=p1->x+1;
p2->y=p1->y-1;
flag[p2->x][p2->y]=1;
temp[p2->x][p2->y]=0;
S.push_back(p2);
}
if(!flag[p1->x][p1->y-1]&&temp[p1->x][p1->y-1])
{
p2=new struct node;
p2->x=p1->x;
p2->y=p1->y-1;
flag[p2->x][p2->y]=1;
temp[p2->x][p2->y]=0;
S.push_back(p2);
}
if(!flag[p1->x-1][p1->y-1]&&temp[p1->x-1][p1->y-1])
{
p2=new struct node;
p2->x=p1->x-1;
p2->y=p1->y-1;
flag[p2->x][p2->y]=1;
temp[p2->x][p2->y]=0;
S.push_back(p2);
}
}
}
int main()
{
int n,i,j;
while(scanf("%d",&n)!=EOF)
{
S.clear();
int count=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%1d",&temp[i][j]);
flag[i][j]=0;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(temp[i][j]&&(!flag[i][j]))
{
flag[i][j]=1;
bfs(i,j);
count++;
j++;
}
}
}
cout<<count<<endl;
}
return 0;
}