思路
CCF的大模拟题最恶心的地方不是代码量大,而是题总是说不明白。这道题需要仔细筛选题干找到题目要求。代码写作1小时,看题3小时才从0到100。
本题注意事项
- 输出每一个R,G,B对应的值,注意如得到17,输出为"\x31\x37",而非输出17的十六进制(11)
- 输入为16进制,但不知道为啥转为10进制后求平均值,无需转16进制,而是直接转字符串才能通过的。
- 在无重复,非0的情况下每一个代码块前都有"\x1B\x5B\x34\x38\x3B\x32\x3B"
- 在与上一代码块重复情况下(注意换行要刷新储存的前一个RGB值,因为这个一直0分)"\x1B\x5B\x30\x6D",在每行起始RGB值均为0,所以刷新值就选0(否则要扣分的)
- 在RGB值均为0(默认值)情况下,直接输出"\x1B\x5B\x30\x6D"
- 在每一行的末尾,如果颜色不是默认值,需要输出"\x1B\x5B\x30\x6D"
代码
#include <iostream>
#include <stdio.h>
#include <vector>
#include <string.h>
using namespace std;
struct color{
int R;
int G;
int B;
};
string tostring(int t){
string res="";
if(t==0)
return "0";
while(1){
int temp=t%10;
res=(char)(temp+'0')+res;
t/=10;
if(t==0)
break;
}
return res;
}
int sixtoten(string s){
int res=0;
for(int i=0;i<s.length();i++){
if(s[i]>='a' && s[i]<='f'){
res=16*res+s[i]-'a'+10;
}
else{
res=16*res+s[i]-'0';
}
}
return res;
}
int main(){
int m=0,n=0;
//注意宽为列数,高为行数
cin>>n>>m;
int p=0,q=0;
cin>>q>>p;
vector< vector<color> > pos(m);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
string s="";
cin>>s;
string R="";
string G="";
string B="";
if(s.length()==7){
R=s.substr(1,2);
G=s.substr(3,2);
B=s.substr(5,2);
}
else if(s.length()==4){
R=s.substr(1,1)+s.substr(1,1);
G=s.substr(2,1)+s.substr(2,1);
B=s.substr(3,1)+s.substr(3,1);
}
else if(s.length()==2){
R=s.substr(1,1)+s.substr(1,1);
G=B=R;
}
int iR=0,iG=0,iB=0;
iR=sixtoten(R);
iG=sixtoten(G);
iB=sixtoten(B);
color nowc;
nowc.R=iR;
nowc.G=iG;
nowc.B=iB;
pos[i].push_back(nowc);
}
}
int lastavr[3]={0};
int avr[3]={0};
for(int i=0;i<m;i+=p){
memset(lastavr,0,sizeof(avr));
for(int j=0;j<n;j+=q){
memset(avr,0,sizeof(avr));
for(int k=0;k<p;k++){
for(int z=0;z<q;z++){
avr[0]+=pos[i+k][j+z].R;
avr[1]+=pos[i+k][j+z].G;
avr[2]+=pos[i+k][j+z].B;
}
}
int flag=1;
string res[3]={""};
for(int i=0;i<3;i++){
avr[i]/=p*q;
if(lastavr[i]!=avr[i]){
flag=0;
}
lastavr[i]=avr[i];
res[i]=tostring(avr[i]);
}
if(flag==0){
if(avr[0]==0 && avr[1]==0 && avr[2]==0){
cout << "\\x1B\\x5B\\x30\\x6D";
}
else{
cout<<"\\x1B\\x5B\\x34\\x38\\x3B\\x32\\x3B";
for(int i=0;i<3;i++){
for(int j=0;j<res[i].length();j++){
cout<<"\\x"<<(res[i][j]+30-'0');
}
if(i!=2)
cout<<"\\x3B";
}
cout<<"\\x6D";
}
}
cout<<"\\x20";
if(j+q==n && !(avr[0]==0 && avr[1]==0 && avr[2]==0)){
cout << "\\x1B\\x5B\\x30\\x6D";
}
}
cout<<"\\x0A";
}
return 0;
}