图像压缩算法:去除重复行和列
图像压缩算法:去除重复行和列
有一个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>> compressedImage;
for (int i = 0; i < H; i++) {
bool duplicateRow = false;
for (int j = 0; j < compressedImage.size(); j++) {
if (image[i] == compressedImage[j]) {
duplicateRow = true;
break;
}
}
if (!duplicateRow) {
compressedImage.push_back(image[i]);
}
}
vector<vector<int>> transposedImage(W, vector<int>(compressedImage.size()));
for (int i = 0; i < compressedImage.size(); i++) {
for (int j = 0; j < W; j++) {
transposedImage[j][i] = compressedImage[i][j];
}
}
vector<vector<int>> compressedTransposedImage;
for (int i = 0; i < W; i++) {
bool duplicateColumn = false;
for (int j = 0; j < compressedTransposedImage.size(); j++) {
if (transposedImage[i] == compressedTransposedImage[j]) {
duplicateColumn = true;
break;
}
}
if (!duplicateColumn) {
compressedTransposedImage.push_back(transposedImage[i]);
}
}
for (int i = 0; i < compressedTransposedImage[0].size(); i++) {
for (int j = 0; j < compressedTransposedImage.size(); j++) {
cout << compressedTransposedImage[j][i] << " ";
}
cout << endl;
}
return 0;
}
原文地址: https://www.cveoy.top/t/topic/qqgU 著作权归作者所有。请勿转载和采集!