• 12132


    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    #include<string.h>
    
    void main(){
        int i,j,k,m;
        int width,height,start,world;
        int *bmp,*Lcount;
        bool *Lflag;
    
    
        FILE *fp; 
    
        if((fp=fopen("in1.bmp","rb"))==NULL){
            printf("文件打开失败");
            return;
        }
    
        fseek(fp,10L,0);
        fscanf(fp,"%4c",&start);   // 4c表示该数据占4个字节
    //    printf("start = %d
    ",start);
    
        fseek(fp,18,0);
        fscanf(fp,"%4c",&width);
    //    printf("width = %d
    ",width);
    
        fseek(fp,22,0);
        fscanf(fp,"%4c",&height); 
    //    printf("height = %d
    ",height);
    
        bmp = (int*)malloc((width+2)*sizeof(int));
        memset(bmp,0,(width+2)*sizeof(int));
    
        Lcount = (int*)malloc(width*sizeof(int));
        memset(Lcount,0,width*sizeof(int));
    
        Lflag = (bool*)malloc(width*sizeof(bool));
        memset(Lflag,0,width*sizeof(bool));
    
        Lcount--;
        Lflag--;
    
        fseek(fp,start,0);
    
        world = ( width%32 ? width/32+1 : width/32 )*4;
    
        int last,i1,i2,i3;
        int eCount = 0 ;
        for(i=0 ; i<height ; i++ ){
            char c;
            k=1;
            last=0;
            for(j=0 ; j<world ; j++){
                fscanf(fp,"%c",&c);
                for(m = 7 ; m >= 0 && k<=width ; m-- ){
                    if( !( 1<<m & c ) ){
    //printf("*");
                        if(bmp[k]){
                            last = bmp[k];
                            Lcount[last]++;
                            Lflag[last] = true ;
                        }
                        else{
                            i1 = last ? last : bmp[k-1] ;
                            i3 = bmp[k+1] ;
                            last = 0;
    
                            if( i1 || i3){                            
                                if( i1 && i3 && ( i1 != i3 ) ){//确定需要连接
                                    Lcount[i1] += Lcount[i3] ;
                                    Lcount[i3]=0;
                                    for(i2=1;i2<=width ; i2++){
                                        if(bmp[i2]==i3)
                                            bmp[i2] = i1;
                                    }
                                }
                                else{
                                    if(!i1)
                                        i1=i3;
                                }
                                bmp[k] = i1 ;
                                Lcount[i1]++;
                                Lflag[i1] = true ;
                            }
                            else{//插入
                                for(i2=1;Lcount[i2];i2++);
                                Lcount[i2]=1;
                                bmp[k] = i2 ;
                                Lflag[i2] = true ;
                            }
                        }
                    }
                    else{
    //printf(" ");
                        last = bmp[k] ;
                        bmp[k] = 0 ;
                    }
                    k++;
                }
            }
    //printf("
    ");
            for(i2=1;i2<=width;i2++){
                if(Lcount[i2] && !Lflag[i2] ){
                    printf("%d
    ",Lcount[i2]);
                    Lcount[i2] = 0 ;
                    eCount++;
                }
                Lflag[i2]=false;
            }
        }
        fclose(fp);
    
        free(Lflag+1);
        free(Lcount+1);
        free(bmp);
    
        printf("count=%d
    ",eCount);
    }
  • 相关阅读:
    bzoj 1057: [ZJOI2007]棋盘制作
    【NOIP2012】开车旅行
    bzoj 2326: [HNOI2011]数学作业
    一本通1527欧拉回路
    一本通1530 Ant Trip
    一本通1528单词游戏
    luogu1856
    CF1045G
    10.18模拟赛
    10.16模拟赛
  • 原文地址:https://www.cnblogs.com/wwjyt/p/3181082.html
Copyright © 2020-2023  润新知