社区讨论

造了一组数据跟题解是一样的结果还是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 条回复,欢迎继续交流。

正在加载回复...