CCF认证201909-3字符画

欢迎访问我的CCF认证考试题解目录

题目描述

CCF认证201909-3字符画题目描述

代码

//未敲
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
//https://blog.csdn.net/qq_42295427/article/details/104425068
struct RGB {
	int r;
	int g;
	int b;
	RGB() {};
	RGB(int _r, int _g, int _b) {
		r = _r, g = _g, b = _b;
	}
}xs[1082][1922];
int main() {
	ios::sync_with_stdio(false);
	int m, n, p, q;
	cin >> m >> n >> p >> q;
	for (int i = 0; i < n; i++) {//注意这里变换 m是宽 n是高
		for (int j = 0; j < m; j++) {
			string str;
			cin >> str;
			int r, g, b;
			if (str.length() == 7) {
				r = stoi(str.substr(1, 2),0,16);// stoi(字符串,起始位置,n进制),将 n 进制的字符串转化为十进制
				g = stoi(str.substr(3, 2),0,16);
				b = stoi(str.substr(5, 2),0,16);
			}
			else if (str.length() == 4) {
				r = stoi(string(2, str[1]),0,16);
				g = stoi(string(2, str[2]),0,16);
				b = stoi(string(2, str[3]),0,16);
			}
			else if (str.length() == 2) {
				r = g = b = stoi(string(2, str[1]),0,16);
			}
			xs[i][j] = RGB(r, g, b);
		}
	}

	for (int i = 0; i < n; i += q) {
		int pr, pg, pb;
		int r = 0, g = 0, b = 0;
		bool same = false;
		for (int j = 0; j < m; j += p) {
			pr = r, pg = g, pb = b;//记录前一片
			r = g = b = 0;
			for (int ii = i; ii < i + q; ii++) {
				for (int jj = j; jj < j + p; jj++) {
					r += xs[ii][jj].r;
					g += xs[ii][jj].g;
					b += xs[ii][jj].b;
				}
			}
			r /= p * q, g /= p * q, b /= p * q;
			if (pr == r && pg == g && pb == b)  same = true;//和前一片平均值相同
			else    same = false;
			if (!same) {//与前一片不同
				string str = "\\x1B\\x5B";
				if (r == 0 && g == 0 && b == 0) {
					str += "\\x30\\x6D\\x20";
				}
				else {
					str += "\\x34\\x38\\x3B\\x32\\x3B";
					string sr, sg, sb;
					sr = to_string(r);//十进制转串
					sg = to_string(g);
					sb = to_string(b);
					for (int k = 0; k < sr.length(); k++)   str += "\\x3" + string(1, sr[k]);
					str += "\\x3B";
					for (int k = 0; k < sg.length(); k++)   str += "\\x3" + string(1, sg[k]);
					str += "\\x3B";
					for (int k = 0; k < sb.length(); k++)   str += "\\x3" + string(1, sb[k]);
					str += "\\x6D\\x20";
				}
				cout << str;
			}
			else {
				cout << "\\x20";
			}
		}
		if (!(r == 0 && g == 0 && b == 0)) {
			cout << "\\x1B\\x5B\\x30\\x6D";
		}
		cout << "\\x0A";
	}
	/*system("pause");*/
	return 0;
}

/*****************
2 2
1 2
#111111
#0
#000000
#111

1 1
1 1
#010203

3 2
1 2
#0
#0
#010101
#010102
#0
#0


int to_int(char c) {
if (c >= '0' && c <= '9')   return c - '0';
else return c - 'a' + 10;
}
******************/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值