CCF201909-3 字符画(100分)文本处理

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCF201909-3 字符画(100分)文本处理相关的知识,希望对你有一定的参考价值。

试题编号: 201909-3
试题名称: 字符画
时间限制: 5.0s
内存限制: 512.0MB



问题链接CCF201909-3 字符画
问题简述:(略)
问题分析:(略)
程序说明:(略)
参考链接:(略)
题记:(略)

100分的C++语言程序如下:

/* CCF201909-3 字符画 */

#include <bits/stdc++.h>

using namespace std;

const int N = 1080;
const int M = 1920;
struct RGB {
    int rgb[3];
} image[N][M];

bool isrgbeq(RGB &a, RGB &b)
{
    for (int i = 0; i < 3; i++)
        if (a.rgb[i] != b.rgb[i]) return false;
    return true;
}

void output(string t)
{
    for(int i = 0; t[i]; i++) // 转为ascii码
        cout << "\\\\x" << hex << uppercase << setw(2) << int(t[i]);
}

int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int m, n, p, q;
    cin >> m >> n >> p >> q;

    string rgb;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++) {
            cin >> rgb;
            if (rgb.size() == 2)
                rgb += string(5, rgb.back());   // #a变换为#aaaaaa
            else if (rgb.size() == 4)
                // #abc变换为#aabbcc
                rgb = "#" + string(2,rgb[1]) + string(2,rgb[2]) + string(2,rgb[3]);

            // 将16进制转换为10进制进行存储
            RGB color;
            for (int k = 0; k < 3; k++)
                color.rgb[k] = stoi(rgb.substr(2 * k + 1, 2), 0, 16);
            image[i][j] = color;
        }

    // 处理小块(计算平均值),输出小块
    RGB last = {0, 0, 0}, defcolor = {0, 0, 0};
    for (int i = 0; i < n / q; i++) {
        for (int j = 0; j < m / p; j++) {
            RGB cur = {0, 0, 0};
            for (int i2 = 0; i2 < q; i2++)
                for (int j2 = 0; j2 < p; j2++)
                    for (int k = 0; k < 3; k++)
                        cur.rgb[k] += image[i * q + i2][j * p + j2].rgb[k];
            // 计算平均值
            for (int k = 0; k < 3; k++)
                cur.rgb[k] /= p * q;

            if (isrgbeq(cur, last))   // 跟前一个小块一样
                ;
            else if (isrgbeq(cur, defcolor)) { // 跟默认一样
                last = defcolor;
                cout << "\\\\x1B\\\\x5B" << "\\\\x30\\\\x6D";
            } else {
                //如果都不一样
                last = cur;
                output("\\x1b[48;2;" + to_string(cur.rgb[0]) + ";" + to_string(cur.rgb[1]) + ";" + to_string(cur.rgb[2]) + "m");
            }
            cout<<"\\\\x20";  // 每个小块结束输出一个空格
        }
        if (!isrgbeq(last, defcolor)) { // 换行判断结尾是否为默认值
            last = defcolor;
            cout << "\\\\x1B\\\\x5B" << "\\\\x30\\\\x6D";
        }
        cout << "\\\\x0A";    // 输出一个换行符
    }

    return 0;
}

/*
1 1
1 1
#010203

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

以上是关于CCF201909-3 字符画(100分)文本处理的主要内容,如果未能解决你的问题,请参考以下文章

CCF201912-3 化学方程式(100分)文本处理

CCF201809-3 元素选择器(100分)文本处理

CCF202006-3 Markdown渲染器(100分)文本处理

CCF201903-3 损坏的RAID5(100分)数学计算+文本处理

ccf 201909-3

CCF 201709-3 JSON查询 100分