201909-3 字符画

#include <bits/stdc++.h>
#define fixed_out1 outStr(string(1,char(27))+"[0m")
#define fixed_out2 outStr(string(1,char(27))+"[48;2;"),outPixel(R),outChar(';'),outPixel(G),outChar(';'),outPixel(B),outChar('m')
using namespace std;
int getPixel(char a,char b)//这是一个16进制数(用两个字符表示)转化成十进制数字
{
    return (isalpha(a)?(a-'a'+10):(a-'0'))*16+(isalpha(b)?(b-'a'+10):(b-'0'));
}
void outChar(char c)//这是一个把字符转化成十六进制进行输出的函数
{
    cout<<"\\x"<<hex<<uppercase<<setw(2)<<(int)c;
}
void outStr(string str)//将字符串中的每个字符按上述16进制输出
{
    for(int i=0;i<str.size();i++)
        outChar(str[i]);
}
void outPixel(int a)//将一个十进制数字按照上述16进制输出
{
    vector<int> v;
    if(a == 0) v.push_back(0);
    while(a>0)
    {
        v.push_back(a%10);
        a/=10;
    }
    while(v.size())
    {
        outChar(char('0'+v.back()));
        v.pop_back();
    }
}
int m,n,p,q;
int  C[1080][1920][3];//用于记录原来的每个位置的像素(用十进制)
int main()
{
    cin>>m>>n>>p>>q;
    int _B=p*q,i,j,k,l,end_k,end_l;
    cout.fill('0');
    string s;
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            cin>>s;
            switch(s.size()){
            case 2://#a
                s += string(5,s[1]);
                break;
            case 4://#abc
                s = "#"+string(2,s[1])+string(2,s[2])+string(2,s[3]);
                break;
            }
            for(k=0;k<3;k++)    C[i][j][k] = getPixel(tolower(s[k+k+1]),tolower(s[k+k+2]));
        }
    }
    //到此时所有的像素每个分量的16进制已经转化为了10进制数,并且按照行优先的顺序存储在三元组中
    int R=0,G=0,B=0,preR=0,preG=0,preB=0;
    for(i=0;i<n;i+=q)//高就是行
    {
        for(j=0;j<m;j+=p)//宽就是列
        {
            R=0;G=0;B=0;
            for(k=i,end_k=k+q;k<end_k;k++)
                for(l=j,end_l=l+p;l<end_l;l++)
                    R+=C[k][l][0],G+=C[k][l][1],B+=C[k][l][2];
            R/=_B;G/=_B;B/=_B;
            if(!((R==preR)&&(G==preG)&&(B==preB)))
            {
                if(R==0&&G==0&&B==0) fixed_out1;
                else fixed_out2;
                preR = R;preG = G;preB = B;
            }
            outChar(' ');
        }
        if(R!=0||G!=0||B!=0) fixed_out1;
        preR = 0;preG = 0;preB = 0;
        outChar('\n');
    }
    return 0;
}



参考了一位大哥的代码,原代码大哥写的是令人瞋目结舌,拍案叫绝,我改了部分代码原因是更适合我的浅薄的代码基础。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值