图像压缩算法:删除重复行和列

有一个H行W列像素组成的图像, 从上往下数第i行, 从左往右数第j列的像素用ai,j来表示. 图像只由黑白两种颜色组成, ai,j=0表示黑色, ai,j=1表示白色. 现在想要压缩这个图像, 打算按照如下方法压缩:

如果存在相邻的两行完全一样, 就删除其中一行. 如果存在相邻的两列完全一样, 就删除其中一列. 重复以上操作直到无法再进行删除为止, 可以证明最终结果和删除顺序无关.

输入

第一行, 2个整数 H, W. 接下来H行, 每行W个整数. 表示图像. 0表示黑色,1表示白色, 数与数之间用空格分隔。

输出

输出压缩后的图像, 数与数之间用空格分隔.

样例输入

3 3
1 1 0
1 1 0
0 0 1

样例输出

1 0
0 1

提示

数据范围:1≤H,W≤50

C++代码

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int H, W;
    cin >> H >> W;
    vector<vector<int>> image(H, vector<int>(W));

    for (int i = 0; i < H; i++) {
        for (int j = 0; j < W; j++) {
            cin >> image[i][j];
        }
    }

    vector<vector<int>> compressed_image;
    for (int i = 0; i < H; i++) {
        if (i > 0 && image[i] == image[i-1]) {
            continue;
        }
        compressed_image.push_back(image[i]);
    }

    vector<vector<int>> transposed_compressed_image;
    for (int j = 0; j < W; j++) {
        vector<int> column;
        for (int i = 0; i < compressed_image.size(); i++) {
            column.push_back(compressed_image[i][j]);
        }
        if (j > 0 && column == transposed_compressed_image[j-1]) {
            continue;
        }
        transposed_compressed_image.push_back(column);
    }

    for (int i = 0; i < transposed_compressed_image.size(); i++) {
        for (int j = 0; j < transposed_compressed_image[i].size(); j++) {
            cout << transposed_compressed_image[i][j] << ' ';  // 将空格改为英文空格
        }
        cout << endl;
    }

    return 0;
}
图像压缩算法:删除重复行和列

原文地址: https://www.cveoy.top/t/topic/qqgQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录