社区讨论
造了一组数据跟题解是一样的结果还是0分求调
B3851[GESP202306 四级] 图像压缩参与者 5已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @m0p3rvyd
- 此快照首次捕获于
- 2024/09/05 17:46 2 年前
- 此快照最后确认于
- 2025/11/04 21:43 4 个月前
CPP
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
const int N = 20;
int image[N][N];
int res[N][N];
int cnt[256];//频率
int color[16];
//十六进制转十进制
int trans(char c){
if(c <= '9') return c - '0';
return c - 'A' + 10 ;
}
//十进制转十六进制
char trans1(int n){
if(n >= 10) return (char)(n - 10 + 'A');
return (char)(n + '0');
}
int find(int n){
int dis = 256, res = -1;
for(int i = 0; i < 16; i ++ ){
int d = abs(n - color[i]);
if(d < dis){
dis = d;
res = i;
}
}
return res;
}
int main(){
int n = 0, m = 0;
cin >> n;
for(int i = 0; i < 256; i ++ ) cnt[i] = -1;
cin.ignore(); // 忽略换行符
for(int i = 0 ; i < n; i ++ ){
string s;
getline(cin, s);
m = s.size() / 2;
for(int j = 0; j < m; j ++ ){
int c = trans(s[j * 2]) * 16 + trans(s[j * 2 + 1]);
image[i][j] = c;
cnt[c] ++;
}
}
//出现次数最多的16个灰阶
for(int c = 0; c < 16; c ++ ){
int max = 0, id = -1;
for(int i = 0 ; i < 256; i ++ ){
if(cnt[i] > max){
max = cnt[i];
id = i;
}
}
color[c] = id;
cnt[id] = -1;
}
//image灰阶压缩
for(int i = 0; i < n; i ++ ){
for(int j = 0; j < m; j ++ ){
res[i][j] = find(image[i][j]);
}
}
//输出选取的16个灰阶
for(int c = 0; c < 16; c ++ ){//转十六进制输出
cout << trans1(color[c] / 16) << trans1(color[c] % 16);
}
cout << endl;
for(int i = 0; i < n; i ++ ){
for(int j = 0; j < m; j ++ )
cout << trans1(res[i][j]);
cout << endl;
}
return 0;
}
读入是用字符串读的
回复
共 9 条回复,欢迎继续交流。
正在加载回复...