ccf 201909-3 字符畫(100分)

 

 

 

提交後得100分的C++程序如下:

#include<bits/stdc++.h>
using namespace std;
struct pixle
{
	int r,g,b;
 };
static pixle pic[1080][1920];
//16進制轉換成10進制
static inline int char2int(char c)
{
	return c>='0'&&c<='9'? c-'0':
		   c>='a'&&c<='f'? c-'a'+10:
		   c>='A'&&c<='F'? c-'A'+10:
		   	-1;
 } 
 static inline int onecolor2int(char a,char b)
 {
 	return char2int(a)*16+char2int(b);
 }
 static void fillpixle(pixle *p,char *line)
 {
 	if(line[2]=='\0'){
 		int c=onecolor2int(line[1],line[1]);
 		p->r=c;
 		p->g=c;
 		p->b=c;
	 }
	 else if(line[4]=='\0')
	 {
	 	p->r=onecolor2int(line[1],line[1]);
	 	p->g=onecolor2int(line[2],line[2]);
	 	p->b=onecolor2int(line[3],line[3]);
	 }
	 else if (line[7] == '\0')
    {
        p->r = onecolor2int(line[1], line[2]);
        p->g = onecolor2int(line[3], line[4]);
        p->b = onecolor2int(line[5], line[6]);
    }
    else
        assert(0);
 }
 static void padd(pixle *a,pixle b)
 {
 	a->r+=b.r;
 	a->g+=b.g;
 	a->b+=b.b;
 }
 static void pave(pixle *a,int num)
 {
 	a->r/=num;
 	a->g/=num;
 	a->b/=num;
 }
 static inline int peql(pixle a, pixle b)
 {
 	return a.r==b.r&&a.g==b.g&&a.b==b.b;
 }
static void onecolorprint(int c)
{
    char buf[4];
    sprintf(buf, "%d", c);
    for (char *p = buf; *p != '\0'; p++)
        printf("\\x%x", *p);
}

int main()
{
	int m,n,p,q;
	  scanf("%d%d%d%d", &m, &n, &p, &q);
    getchar(); 
    for (int i = 0; i < n; i++)  
        for (int j = 0; j < m; j++) 
        {
            char line[8];
            gets(line);
            fillpixle(&pic[i][j], line);
        }
	for (int r = 0; r < n; r += q)
    {
        pixle pipre = {0};             
        for (int c = 0; c < m; c += p) 
        {
        pixle pi = {0};
            for (int i = r; i < r + q; i++)
                for (int j = c; j < c + p; j++)
                    padd(&pi, pic[i][j]);
            pave(&pi, p * q);

            if (!peql(pi, pipre))
                if (peql(pi, (pixle){0}))
                    printf("\\x1B\\x5B\\x30\\x6D"); 
                else
                {
                  
                    printf("\\x1B\\x5B\\x34\\x38\\x3B\\x32\\x3B");
                    onecolorprint(pi.r);
                    printf("\\x3B");
                    onecolorprint(pi.g);
                    printf("\\x3B");
                    onecolorprint(pi.b);
                    printf("\\x6D");
                }

            printf("\\x20"); 

            pipre = pi;
        }
        if (!peql(pipre, (pixle){0})) 
            printf("\\x1B\\x5B\\x30\\x6D");
        printf("\\x0A"); 
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章