• 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;
    } 
    

      

  • 相关阅读:
    笔试题 易错题目解析
    SqlServer 函数 大全
    视频上传到自己的服务器打不开
    sql 计算生日提请日期
    Web API 异常处理(转)
    微软源代码管理工具TFS2013安装与使用详细图文教程(Vs2013)
    关于枚举的用法和类型转换
    html title换行方法 如a链接标签内title属性鼠标悬停提示内容换行
    JS的parent、opener、self对象
    uploadfiy
  • 原文地址:https://www.cnblogs.com/Rosanna/p/3436910.html
Copyright © 2020-2023  润新知