欢迎访问我的CCF认证考试题解目录哦
题目描述
代码
//未敲
#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;
}
******************/