我这辈子都不想弄了的《笔记16》
2025-09-06 12:47:08
发布于:广东
这是一道的题叫:[GESP202306 四级] 图像压缩
题解[1],点击跳转
方法
压缩图像——步骤
-
从输入的图像数据中,统计每种灰阶出现的次数
-
选出出现最多的
-
如果次数相同,按灰阶值从小到大排序
-
编号
-
映射到最近其中之一(16)
-
计算与16种灰阶的差的绝对值
-
选择绝对值最小的
-
如果绝对值相同,选编号最小的
图: | |
---|---|
"AB":0 | "10":8 |
"CF":1 | "11":9 |
"FF":2 | "98":A |
"00":3 | "01":B |
"CB":4 | "1B":C |
"09":5 | "67":D |
"AC":6 | "76":E |
"07":7 | "FC":F |
题解
@ZsH68122zSh(洛谷的)
谢了你的题解
#include<bits/stdc++.h>
using namespace std;
int n;
char s[30][30];
struct grey{
pair<char,char> cl;
int cnt;luofu
}gr[256];
map< pair<char,char> ,bool> bct;
map< pair<char,char> , pair<char,int> > mp;//
void InitGrey(){
for(int i=0;i<256;i++) gr[i].cnt=0;
return;
}
int st_t(pair<char,char> st){
int s1=st.first>='0'&&st.first<='9' ? st.first-'0' : st.first-'A'+10;
int g1=st.second>='0'&&st.second<='9' ? st.second-'0' : st.second-'A'+10;
return s1*16+g1;
}
char t_st(int t){
return t<10 ? t+'0' : t-10+'A';
}
bool cmp(grey cmp1,grey cmp2){
return cmp1.cnt==cmp2.cnt ? st_t(cmp1.cl)<st_t(cmp2.cl) : cmp1.cnt>cmp2.cnt;
}
int main()
{
scanf("%d",&n);
InitGrey();//初始化
for(int i=0;i<n;i++){
scanf("%s",s[i]);
for(int j=0;j<strlen(s[i]);j+=2){
pair<char,char> gr16=make_pair(s[i][j],s[i][j+1]);
int gr10=st_t(gr16);
gr[gr10].cl=gr16;
gr[gr10].cnt++;
}
}
sort(gr,gr+256,cmp);
for(int i=0;i<16;i++){
printf("%c%c",gr[i].cl.first,gr[i].cl.second);
char ch=t_st(i);
mp[gr[i].cl]=make_pair(ch,st_t(gr[i].cl));
bct[gr[i].cl]=true;
}
for(int i=0;i<n;i++){
printf("\n");
for(int j=0;j<strlen(s[i]);j+=2){
pair<char,char> str=make_pair(s[i][j],s[i][j+1]);
if(bct[str]) printf("%c",mp[str].first);
else{//不是前 16
int t1=st_t(str),d_min=260;
char ch;
for(int k=0;k<16;k++){//遍历前 16 个查找
int d=abs(st_t(gr[k].cl)-t1);
if(d<d_min) d_min=d,ch=t_st(k);
}
printf("%c",ch);
}
}
}
return 0;
}
这是题解 ↩︎
这里空空如也
有帮助,赞一个