题解
2026-09-05 15:52:36
发布于:广东
20阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
struct Pixel{
string s;
int cnt = 1;//如果字符出现过,至少1次
}a[260];
int n,m; //m代表出现了多少种像素点
string str[30];//保存每一行的像素点十六进制数
bool cmp(Pixel x,Pixel y){
return x.cnt > y.cnt || x.cnt == y.cnt && x.s<y.s;
}
int tran(char a,char b){//十六进制转十进制
int g,d;
if(a>='0'&&a<='9') g = a-'0';
else g = a-'A'+10;
if(b>='0'&&b<='9') d = b-'0';
else d = b-'A'+10;
return g*16+d;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>str[i];
for(int i=1;i<=n;i++){
//遍历字符串
int l = str[i].size();
for(int j=0;j<l;j+=2){//两个两个看,每次+2
string s = "";
s = s + str[i][j] + str[i][j+1];
bool f = 0;
for(int k=1;k<=m;k++){
if(a[k].s==s) {//如果当前的字符跟原来出现的字符有相同的
a[k].cnt++;
f = 1;
}
}
if(!f)a[++m].s = s;
}
}
sort(a+1,a+m+1,cmp);//给字符串排序,按数量排序
for(int i=1;i<=16;i++) cout<<a[i].s;
cout<<endl;
string sn = "#0123456789ABCDEF";
for(int i=1;i<=n;i++){
//遍历字符串
int l = str[i].size();
for(int j=0;j<l;j+=2){//两个两个看,每次+2
//拿一个跟前16个比较,差值最小的进行转换
int t = tran(str[i][j],str[i][j+1]);
int mi=INT_MAX,mii=1;
for(int k = 1;k<=16;k++){//跟前十六个比较
int c = tran(a[k].s[0],a[k].s[1]);
if(abs(t-c) < mi){
mi = abs(t-c);
mii = k;//把差值最小的位置记录下来
}
}
cout<<sn[mii];
}
cout<<endl;
}
return 0;
}
这里空空如也

有帮助,赞一个