提交後得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");
}
}