造了一组数据跟题解是一样的结果还是0分求调
查看原帖
造了一组数据跟题解是一样的结果还是0分求调
735020
封禁用户楼主2024/9/5 17:45
#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;
}

读入是用字符串读的

2024/9/5 17:45
加载中...