1 solutions

  • 0
    @ 2024-12-5 18:19:40

    C++ :

    #include <iostream>
    #include <cstring>
    using namespace std;
    int image[20][20];
    int cpimg[20][20];
    int his[256];
    int color[16];
    // 一位十六进制字符转换为数字
    int trans(char a) {
    if (a <= '9')
    return (a - '0');
    return (a - 'A' + 10);
    }
    // 一位十六进制数字转换为字符
    char itrans(int n) {
    if (n >= 10)
    return (char)(n - 10 + 'A');
    return (char)(n + '0');
    }
    // 寻找离 c 最近的灰阶
    int compress(int c) {
    int dis = 256, res = -1;
    for (int i = 0; i < 16; i++) {
    int d = c - color[i];
    if (d < 0)
    d = -d;
    if (d < dis) {
    dis = d;
    res = i;
    }
    }
    return res;
    }
    int main() {
    int N = 0, M = 0;
    cin >> N;
    // 灰阶计数,初始化为 0
    for (int i = 0; i < 256; i++)
    his[i] = 0;
    // 输入图像,并对灰阶计数
    for (int i = 0; i < N; i++) {
    char line[50];
    cin >> line;
    M = strlen(line) / 2;
    for (int j = 0; j < M; j++) {
    int c = trans(line[j * 2]) * 16 + trans(line[j * 2 + 1]);
    image[i][j] = c;
    his[c]++;
    }
    }
    // 选取出现次数最多的 16 个灰阶
    for (int c = 0; c < 16; c++) {
    int max = -1, max_id = -1;
    for (int i = 0; i < 256; i++)
    if (his[i] > max) {
    max = his[i];
    max_id = i;
    }
    color[c] = max_id;
    his[max_id] = -1;
    }
    // 将 image 的灰阶压缩为 cpimg
    for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++)
    cpimg[i][j] = compress(image[i][j]);
    // 输出选取的 16 个灰阶
    for (int c = 0; c < 16; c++)
    cout << itrans(color[c] / 16) << itrans(color[c] % 16);
    cout << endl;
    // 输出压缩后的图像
    for (int i = 0; i < N; i++) {
    for (int j = 0; j < M; j++)
    cout << itrans(cpimg[i][j]);
    cout << endl;
    }
    return 0;
    }
    
    • 1

    Information

    ID
    9161
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By