CCF-201809-3
本题要注意的地方
- 对于RGB值,要先将10进制的RGB值转换成字符串,再以16进制逐个输出字符(十六进制值都是两位,这个问题也不大)。
- 输出完一行字符,输出换行符之前,要检查当前RGB值是否是默认状态,如果不是,要置为默认状态。
- 输入的RGB值大小写都有(这个要考虑进去)
- (比较坑的是)初始时就为默认状态,如果输出是默认不需要设置,直接输出空格,后面每行开始同理。
AC代码写的比较繁琐,把第一反应写下来了,没有细想,但想着是自己看的,就贴出来了
#include<bits/stdc++.h>
using namespace std;
typedef struct
{
int R;
int G;
int B;
}RGB;
RGB rgb[1080][1920];
int Hex2N(string s)
{
switch(s[0])
{
case 'F':return 15;
case 'f':return 15;
case 'E':return 14;
case 'e':return 14;
case 'D':return 13;
case 'd':return 13;
case 'C':return 12;
case 'c':return 12;
case 'B':return 11;
case 'b':return 11;
case 'A':return 10;
case 'a':return 10;
default:return s[0]-'0';
}
}
string N2Char(int n)
{
switch(n)
{
case 0:return "\\x30";
case 1:return "\\x31";
case 2:return "\\x32";
case 3:return "\\x33";
case 4:return "\\x34";
case 5:return "\\x35";
case 6:return "\\x36";
case 7:return "\\x37";
case 8:return "\\x38";
case 9:return "\\x39";
}
return "";
}
int Str2N(string s)
{
int N;
switch(s.length())
{
case 1:
{
N=Hex2N(s.substr(0,1));
N=N*16+N;
break;
}
case 2:
{
N=Hex2N(s.substr(0,1));
N=N*16+Hex2N(s.substr(1,1));
break;
}
}
return N;
}
string N2Str(int n)
{
string s="";
if(n==0)s="\\x30";
else
while(n)
{
s=N2Char(n%10)+s;
n=n/10;
}
return s;
}
int main()
{
ios::sync_with_stdio(false);
int i,j,v,t,m,n,p,q,flag=0,N_R,N_G,N_B,Last_R=0,Last_G=0,Last_B=0;
string str,s;
cin>>m>>n;
cin>>p>>q;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
cin>>str;
switch(str.length())
{
case 2:
{
s=str.substr(1,1);
rgb[i][j].R=Str2N(s);
rgb[i][j].G=Str2N(s);
rgb[i][j].B=Str2N(s);
break;
}
case 4:
{
s=str.substr(1,1);
rgb[i][j].R=Str2N(s);
s=str.substr(2,1);
rgb[i][j].G=Str2N(s);
s=str.substr(3,1);
rgb[i][j].B=Str2N(s);
break;
}
case 7:
{
s=str.substr(1,2);
rgb[i][j].R=Str2N(s);
s=str.substr(3,2);
rgb[i][j].G=Str2N(s);
s=str.substr(5,2);
rgb[i][j].B=Str2N(s);
break;
}
}
}
for(i=0;i<n/q;i++)
{
for(j=0;j<m/p;j++)
{
N_R=0;N_G=0;N_B=0;
for(v=i*q;v<(i+1)*q;v++)
for(t=j*p;t<(j+1)*p;t++)
{
N_R+=rgb[v][t].R;
N_G+=rgb[v][t].G;
N_B+=rgb[v][t].B;
}
N_R/=(p*q);N_G/=(p*q);N_B/=(p*q);
if(N_R==Last_R&&N_G==Last_G&&N_B==Last_B)cout<<"\\x20";
else if(N_R==0&&N_G==0&&N_B==0)
cout<<"\\x1B\\x5B\\x30\\x6D\\x20";
else
{
cout<<"\\x1B\\x5B\\x34\\x38\\x3B\\x32\\x3B";
cout<<N2Str(N_R);
cout<<"\\x3B";
cout<<N2Str(N_G);
cout<<"\\x3B";
cout<<N2Str(N_B);
cout<<"\\x6D\\x20";
}
Last_R=N_R;
Last_G=N_G;
Last_B=N_B;
}
if(Last_R!=0||Last_G!=0||Last_B!=0)cout<<"\\x1B\\x5B\\x30\\x6D";
Last_R=0;
Last_G=0;
Last_B=0;
cout<<"\\x0A";
}
return 0;
}