60分求调,谢谢
查看原帖
60分求调,谢谢
890321
mooktian楼主2024/6/11 11:04
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,a[25][25],b[25][25],vis[256],p[256];
//n行数,m列数,a数组b数组记录灰度矩阵
//vis标记灰度值的数量,p数组用来排序
int c(string str) {//把两位的十六进制字符转化成十进制数字
	int num = 0;
	for(int i = 0;i < 2;i++) {
		if(str[i] <= '9' && str[i] >= '0') num += (str[i] - '0')*pow(16,i^1);
		else num += (str[i] - 'A' + 10)*pow(16,i^1);
	}
	return num;
}
void init() {//初始化
	for(int i = 0;i <= 255;i++) p[i] = i;
}
bool cmp(int x,int y) {//排序比较关系
	return vis[x] > vis[y] || (vis[x] == vis[y] && x < y);
}
int judge(int x) {//灰度从256压缩到16
	int md = 300,id;//md标记到最近的灰度的距离,id标记最近的灰度
	for(int i = 0;i < 16;i++) {
		if(abs(x - p[i]) < md) {
			md = abs(x - p[i]), id = i; 
		}else if(abs(x - p[i]) == md) {
			if(p[id] > p[i]) id = i;
		}
	}
	return id;
}
int main( ) {
init();
cin >> n;
string s;
for(int i = 1;i <= n;i++) {
	cin >> s;
	m = s.size();
	string tmp;
	for(int j = 0;j < m;j += 2) {
		tmp = s.substr(j,2);
		a[i][j/2+1] = c(tmp);
		vis[a[i][j/2+1]]++;
	}
}
sort(p,p+256,cmp);
for(int i = 0;i < 16;i++) printf("%02X",p[i]);
printf("\n");
for(int i = 1;i <= n;i++) {
	for(int j = 1;j <= m/2;j++) {
		b[i][j] = judge(a[i][j]);
		printf("%X",b[i][j]);
	}
	printf("\n");
}
return 0;
}

2024/6/11 11:04
加载中...