#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;
}
参考了一位大哥的代码,原代码大哥写的是令人瞋目结舌,拍案叫绝,我改了部分代码原因是更适合我的浅薄的代码基础。
201909-3 字符画
最新推荐文章于 2023-08-16 17:06:03 发布