CCF-201809-3

CCF-201809-3

本题要注意的地方

  1. 对于RGB值,要先将10进制的RGB值转换成字符串,再以16进制逐个输出字符(十六进制值都是两位,这个问题也不大)。
  2. 输出完一行字符,输出换行符之前,要检查当前RGB值是否是默认状态,如果不是,要置为默认状态。
  3. 输入的RGB值大小写都有(这个要考虑进去)
  4. (比较坑的是)初始时就为默认状态,如果输出是默认不需要设置,直接输出空格,后面每行开始同理。

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值