CCF CSP 201909-3 字符画

调试字符串模拟的代码可 太虚了。。

#include 
using namespace std;
const string ESC(1, char(27));
int n, m, p, q;
struct node{
	int r, g, b;
	bool operator!=(const node &y)const
	{
		return r != y.r || g != y.g || b != y.b;
	}
}RGB[2000][2000];

int dec(string s)
{
	int res = 0;
	for(int i = 0; i < s.size(); ++i)
	{
		char c = tolower(s[i]);
		if(isalpha(c)) res = res * 16 + c - 'a' + 10;
		else res = res * 16 + c - '0';
	}
	return res;
}
void deal(int x,int y,string s)
{
	if(s.size() == 1) s = string(6, s[0]);
	else if(s.size() == 3) s = string(2, s[0]) + string(2, s[1]) + string(2, s[2]);
	int r, g, b;
	r = dec(s.substr(0, 2));
	g = dec(s.substr(2, 2));
	b = dec(s.substr(4, 2)); 
	RGB[x][y] = {r, g, b};
	//printf("%d %d %d\n", r, g, b);
}

void print(string s)
{
	for(int i = 0; i < s.size(); ++i) cout << "\\x" << hex << uppercase << setw(2) << (int)s[i];
}
node cal(int l1,int l2,int r1,int r2)
{
	node tmp = {0, 0, 0};
	for(int i = l1; i < r1; ++i)
		for(int j = l2; j < r2; ++j)
		{
			tmp.r += RGB[i][j].r;
			tmp.g += RGB[i][j].g;
			tmp.b += RGB[i][j].b;
		}
	tmp.r /= p * q; tmp.g /= p * q; tmp.b /= p * q;
	//printf("%d %d %d %d %d %d %d\n",l1, l2, r1, r2, tmp.r, tmp.g, tmp.b);
	return tmp;
}
string tostring(int x)
{
	string res = "";
	if(!x) res += "0"; // 0也要输出 
	while(x) res += x % 10 + '0', x /= 10;
	reverse(res.begin(),res.end());
	return res;
}
int main()
{
	//freopen("1.txt", "r", stdin);
	ios::sync_with_stdio(false);
	cout.fill('0');
	cin >> m >> n >> p >> q;
	for(int i = 0; i < n; ++i)
		for(int j = 0; j < m; ++j)
		{
			string rgb; cin >> 	rgb;
			deal(i, j, rgb.substr(1));	
		} 

	node pre = {0, 0, 0};
	for(int i = 0; i < n; i += q)
	{
		for(int j = 0; j < m; j += p)
		{
			node tmp = cal(i, j, i + q, j + p);
			//printf("%d %d %d %d %d %d\n", tmp.r, tmp.g, tmp.b, pre.r, pre.g,pre.b);
			if(tmp != pre)
			{
				if(tmp.r == 0 && tmp.g == 0 && tmp.b == 0)
				{
					print(ESC + "[0m");
				}
				else
				{
					string r = tostring(tmp.r), g = tostring(tmp.g), b = tostring(tmp.b);
					print(ESC + "[48;2;"+ r +";"+ g + ";" + b + "m");
				}
				pre = tmp;
			}
			print(" ");
		}
		if(pre.r != 0 || pre.g != 0 || pre.b != 0) print(ESC + "[0m");
		print("\n");
		pre = {0, 0, 0};	
	}
		
}

 

你可能感兴趣的:(CCF)