其他分享
首页 > 其他分享> > csp 字符画

csp 字符画

作者:互联网

#include<bits/stdc++.h>
using namespace std;
int n,m,p,q;
int all[1090][1930][3];
bool ok(int *a,int*b)
{
    for(int i=0; i<3; i++)
        if(a[i]!=b[i])
            return false;
    return true;
}
int convert(string t)
{
    int ans=0;
    for(int i=0; i<t.size(); i++)
    {
        if(t[i]<='9'&&t[i]>='0')
        {
            ans*=16;
            ans+=t[i]-'0';
        }
        else
        {
            ans*=16;
            ans+=(t[i]-'a')+10;
        }
    }
    return ans;
}

void output(int*a,int flag)
{
    string s;
    if(flag==0)
    {
        s="\x1b[0m";
        for(int i=0; i<s.size(); i++)
        {
        char c=s[i];
        printf("\\x%02X", c);
        }
    }
    else
    {
        s="\x1b[48;2;";//+to(a[0])+";"+to(a[1])+";"+to(a[2])+"m";
        for(int i=0; i<s.size(); i++)
        {
        char c=s[i];
        printf("\\x%02X", c);
        }
        for(int i=0;i<3;i++)
        {
            //cout<<a[i]<<"**"<<endl;
          if(a[i]/100>0)
          {
             int t=a[i]/100;
             char a1='0'+t;
             printf("\\x%02X", a1);
             t=a[i]%100;
             t/=10;
             //cout<<t<<"!!!"<<endl;
             a1='0'+t;
             printf("\\x%02X", a1);
             t=a[i]%10;
             a1='0'+t;
             printf("\\x%02X", a1);
             if(i!=2)
             printf("\\x%02X", ';');

          }
            else if(a[i]/10>0)
            {
              int t=a[i]/10;
             char a1='0'+t;
             printf("\\x%02X", a1);
             t=a[i]%10;
             a1='0'+t;
             printf("\\x%02X", a1);
             if(i!=2)
             printf("\\x%02X", ';');
            }
          else
          {
             int t=a[i]%10;
             char a1='0'+t;
             printf("\\x%02X", a1);
             if(i!=2)
             printf("\\x%02X", ';');
          }
          if(i==2)
            printf("\\x%02X", 'm');
        }
    }

}
int main()
{
    cin>>m>>n;
    cin>>p>>q;
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
        {
            string s;
            cin>>s;
            if(s.size()==2)
            {
                s+=string(5,s[s.size()-1]);
            }
            if(s.size()==4)
            {
                s="#"+string(2,s[1])+string(2,s[2])+string(2,s[3]);
            }
            //cout<<s<<endl;
            for(int k=0; k<3; k++)
            {
                string temp=s.substr(2*k+1,2);
                int t=convert(temp);
                all[i][j][k]=t;
            }
        }
    int defaults[3]= {0,0,0};
    for(int i=0; i<n/q; i++)
    {
        int last[3]= {0,0,0};
        for(int j=0; j<m/p; j++)
        {
            //´¦Àíÿ¸öÏñËØ¿é
            int co[3]= {0,0,0};
            for(int x=0; x<q; x++)
            {
                for(int y=0; y<p; y++)
                {
                    for(int k=0; k<3; k++)
                        co[k]+=all[i*q+x][j*p+y][k];
                }
            }
            for(int k=0; k<3; k++)
                {
                    co[k]/=p*q;
                }
            if(!ok(co,last))
            {
                if(ok(co,defaults))
                    output(defaults,0);
                else
                    output(co,1);
            }
            for(int k=0; k<3; k++)
                last[k]=co[k];
            printf("\\x%02X",' ');
        }
        if(!ok(last,defaults))
            output(defaults,0);
        for(int k=0; k<3; k++)
            last[k]=defaults[k];
        printf("\\x%02X",'\n');
    }
}

由于模拟考试不支持c++11.手写了个字符串转数字,十六进制转十进制,有什么问题欢迎大家评论

标签:字符,string,int,x%,a1,printf,csp,02X
来源: https://blog.csdn.net/weixin_43873355/article/details/110533492