CCF CSP 竞赛试题——字符画(201909-3)

第35行while (s.empty()) getline(cin, s);,本来是单独一个getline(cin, s);(在循环外使用了getchar()取出输入流里的回车符)。

照原来那样写法,用vs2015编译器,程序能正确取到第一个字符串,但是用g++4.7.2却总是取出第一个字符串为空。不知为何。

#include <iostream>
#include <stdio.h>
#include <vector>
#include <cctype>
#include <string>
using namespace std;

int to_int(const string& color) {
    int res = 0;
    for (int i = 0; i < color.length(); ++i) {
        int x = isdigit(color[i]) ? color[i] - '0' : color[i] - 'a' + 10;
        res = res << 4 | x;
    }
    return res;
}

void print(const string& s) {
    for (int i = 0; i < s.length(); ++i) {
        int x = (int)s[i];
        char a = x >> 4 >= 10 ? (x >> 4) - 10 + 'A' : (x >> 4) + '0';
        char b = (x & 0xf) >= 10 ? (x & 0xf) - 10 + 'A' : (x & 0xf) + '0';
        cout << "\\x" << a << b;
    }
}

int main() {
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    int m, n, p, q;
    cin >> m >> n >> p >> q;
    vector<vector<int> > colors_origin(n, vector<int>(m));
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            string s;
            while (s.empty()) getline(cin, s);
            string t;
            switch (s.size()) {
                case 2:
                    t.append(6, s[1]);
                    break;
                case 3:
                    t.append(3, s[1]).append(3, s[2]);
                    break;
                case 4:
                    t.append(2, s[1]).append(2, s[2]).append(2, s[3]);
                    break;
                case 7:
                    t = s.substr(1);
                    break;
            }
            colors_origin[i][j] = to_int(t);
        }
    }
    string res;
    static const char* const format = "\x1b[48;2;%d;%d;%dm";
    static const char* const reset = "\x1b[0m";
    char buf[24];
    for (int i = 0; i < n / q; ++i) {
        int cur_r = 0, cur_g = 0, cur_b = 0;
        for (int j = 0; j < m / p; ++j) {
            int r = 0, g = 0, b = 0;
            for (int x = i * q; x < (i + 1) * q; ++x) {
                for (int y = j * p; y < (j + 1) * p; ++y) {
                    int color = colors_origin[x][y];
                    r += color >> 16;
                    g += color >> 8 & 0xff;
                    b += color & 0xff;
                }
            }
            r /= p * q;
            g /= p * q;
            b /= p * q;
            if (!(cur_r == r && cur_g == g && cur_b == b)) {
                if (r == 0 && g == 0 && b == 0) {
                    res.append(reset);
                } else {
                    sprintf(buf, format, r, g, b);
                    res.append(buf);
                }
                cur_r = r, cur_g = g, cur_b = b;
            }
            res.append(1, ' ');
        }
        if (!(cur_r == 0 && cur_g == 0 && cur_b == 0)) res.append(reset);
        res.append(1, '\n');
    }
    print(res);
    return 0;
}
发布了33 篇原创文章 · 获赞 4 · 访问量 8736

猜你喜欢

转载自blog.csdn.net/Touchig/article/details/102842860