1102-黑白图像

描述

 

输入一个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;
} 

  

posted @ 2013-11-22 09:50  七年之后  阅读(272)  评论(0编辑  收藏  举报