字符画( 201909-3

#include<bits/stdc++.h>
using namespace std;
char str[4];
typedef struct block{
	int r;
	int g;
	int b;
	block(int a1,int a2,int a3){
		r=a1;
		g=a2;
		b=a3;
	}
	block(){
		r=0;
		g=0;
		b=0;
	}
	block operator +(const block k){
		r+=k.r;
		g+=k.g;
		b+=k.b;
	}
	block operator -(const block k){
		r-=k.r;
		g-=k.g;
		b-=k.b;
	}
}block;
void f(int a){//10->16
	str[0]='\\';
	str[1]='x';
	int a1=a/16;
	int a2=a%16;
	if(a1>=10){
		str[2]='A'+a1-10;
	}else str[2]=a1+'0';
	if(a2>=10){
		str[3]='A'+a2-10;
	}else str[3]=a2+'0';
}
int xtod(string a){
	char a1=a[0];
	//cout<<"a1="<<a1-'a'+10<<endl;
	char a0=a[1];
	int k1=0,k0=0;
	if(a1>='a'&&a1<='f'){
		//cout<<(a1-'a'-'0'+10)<<endl;
		k1=(a1-'a'+10)*16;
	}else k1=(a1-'0')*16;
//	cout<<k1<<endl;
	if(a0>='a'&&a0<='f'){
		k0=(a0-'a'+10);
	}else k0=(a0-'0');
//	cout<<k0<<endl;
	return k0+k1;
}
//2 2
//1 2
//#111111
//#0
//#000000
//#111
	vector<string>a;
	vector<vector<block> >b;
	vector<vector<block> >sum;
	vector<vector<block> >cnt;
	vector<block>cnt1;
int main(){
	int m,n;
	cin>>m>>n;
	int p,q;
	cin>>p>>q;
	
	string ans="";
	for(int i=0;i<=n;i++){
		b.push_back(vector<block>());
		b[i].push_back(block());
		sum.push_back(vector<block>());
		sum[i].push_back(block());
	}
	for(int i=0;i<m;i++){
		b[0].push_back(block());
		sum[0].push_back(block());
	}
	//cout<<"1";
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			string str;
		cin>>str;
		a.push_back(str);
		block m1;
		if(str.size()==7){
			string str1=str.substr(1,2);
			string str2=str.substr(3,2);
			string str3=str.substr(5,2);
			 m1=block(xtod(str1),xtod(str2),xtod(str3));
			// cout<<xtod(str1);
		}else if(str.size()==4){
			string str1=str.substr(1,1);
			str1+=str1;
			string str2=str.substr(2,1);
			str2+=str2;
			string str3=str.substr(3,1);
			str3+=str3;
			m1=block(xtod(str1),xtod(str2),xtod(str3));
		}else{
			string str1=str.substr(1,1);
			str1+=str1;
			string str2=str1;
			string str3=str1;
			m1=block(xtod(str1),xtod(str2),xtod(str3));
		}
		b[i].push_back(m1);
		} 
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cout<<b[i][j].r<<" "<<b[i][j].g<<" "<<b[i][j].b<<endl;
		}
	}
	//sum[0].push_back(block());
//	for(int i=0;i<n;i++){
//		for(int j=0;j<m;j++){
//			sum[i].push_back(block());
//		}
//	}
//	for(int i=1;i<m;i++){
//		sum[0][i]=sum[0][i-1]+b[0][i];
//	}
//	for(int i=1;i<n;i++){
//		sum[i][0]=sum[i-1][0]+b[i][0];
//	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			sum[i][j].r=sum[i-1][j].r+sum[i][j-1].r-sum[i-1][j-1].r+b[i][j].r;
			sum[i][j].g=sum[i-1][j].g+sum[i][j-1].g-sum[i-1][j-1].g+b[i][j].g;
			sum[i][j].b=sum[i-1][j].b+sum[i][j-1].b-sum[i-1][j-1].b+b[i][j].b;
		}
	}
//		for(int i=1;i<=n;i++){
//		for(int j=1;j<=m;j++){
//			cout<<sum[i][j].r<<" "<<sum[i][j].g<<" "<<sum[i][j].b<<endl;
//		}
//	}
//	for(int i=0;i<b.size();i++){
//		cout<<b[i].r<<" "<<b[i].g<<" "<<b[i].b<<endl;
//	}
	int num=m*n/p*q;
	int area=p*q;
	int m1=0,m2=0;//横的块数和竖的块数
	m1=m/p;
	m2=n/q; 
	cout<<"m1="<<m1<<" m2="<<m2<<endl;
	for(int i=0;i<m2;i++){
		cnt.push_back(vector<block>());
		cnt[i].push_back(block());
	}
	for(int j=0;j<m1;j++){
		cnt[0].push_back(block());
	}
	cout<<"ok"<<endl;
	for(int i=1;i<=m2;i++){
		for(int j=1;j<=m1;j++){
			int x1=0,y1=0,x2=0,y2=0;
			y1=(j-1)*p+1;x1=q*(i-1)+1;
			y2=(j+1)*p;x2=(i+1)*q;
			cnt[i].push_back(sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1]);
		}	
	}
	cout<<"ok1"<<endl;//到这不能运行 
	for(int i=1;i<=m2;i++){
		for(int j=1;j<=m1;j++){
			cnt[i][j].r/=p*q;
			cnt[i][j].g/=p*q;
			cnt[i][j].b/=p*q;
		}	
	}
	for(int i=1;i<=m2;i++){
		for(int j=1;j<=m1;j++){
			cnt1.push_back(cnt[i][j]);
		}	
	}
	for(int i=0;i<m1*m2;i++){
		cout<<"第"<<i<<"块的rgb为:"<<cnt1[i].r<<" "<<cnt1[i].g<<cnt1[i].b<<endl; 
	}
	cout<<"asd";
	for(int i=0;i<cnt1.size();i++){
		if(i==0){
			if(cnt1[i].r==0&&cnt1[i].g==0&&cnt1[i].b==0){
				ans+="\x1b[0m ";
			}else{
				ans+="\x1b[48;2";
				string str1=to_string(cnt1[i].r);
				ans+=str1;
				ans+=";";
				string str2=to_string(cnt1[i].g);
				ans+=str2;
				ans+=";";
				string str3=to_string(cnt1[i].b);
				ans+=str3;
				ans+="m ";
			}
		}else{
			if(cnt1[i].r==cnt1[i-1].r&&cnt1[i].g==cnt1[i-1].g&&cnt1[i].b==cnt1[i-1].b){
				ans+=" ";
				continue;
			}else{
				ans+="\x1b[48;2";
				string str1=to_string(cnt1[i].r);
				ans+=str1;
				ans+=";";
				string str2=to_string(cnt1[i].g);
				ans+=str2;
				ans+=";";
				string str3=to_string(cnt1[i].b);
				ans+=str3;
				ans+="m ";
			}
		}
	}
	ans+="\x1b[0m\n";
//	char a='6';
//	printf("十进制是:%d\n",a);
//	printf("十六进制是:%x\n",a);
//	int a=116;
//	cout<<f(a)<<endl;
//	f(255);
//	for(int i=0;i<4;i++)cout<<str[i];
//	string ans="";
//	cout<<xtod("a2");
//	string s="\x1b[38;2;1;2;3m \x1b[0m\n";
//	string ss="\x1b[48;2;8;8;8m  \x1b[0m\n";
//	char a=' ';
//	printf("%x %d",a,a);
//	for(char t:ss){
//		int k=t;
//		f(k);
//		for(int i=0;i<4;i++)cout<<str[i];
//	}
	//printf("%x",'4');
	//cout<<k;
	for(char t:ans){
		int k=t;
		f(k);
		for(int i=0;i<4;i++)cout<<str[i];
	}
}

没写完

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值