| 试题编号: | 202212-3 |
| 试题名称: | JPEG 解码 |
| 时间限制: | 1.0s |
| 内存限制: | 512.0MB |
不需要优化,按题意写即可
#include<bits/stdc++.h>
using namespace std;
const long long int M=1e5+2;
long long int N,sum=0;
int m[8][8]={0};
int q[8][8]={0};
int num[8][8]={0};
int mm[8][8]={0};
int main(){
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
cin>>q[i][j];
}
}
int i=0,j=0,flag=0,f=1,n,t;
cin>>n>>t;
for(int k=0;k<n;k++){
cin>>m[i][j];
if((i+j)%2==0){
if((i+j)<=7){
if(i==0) j++;
else i--,j++;
}else{
if(j==7) i++;
else i--,j++;
}
}else{
if(i+j<7){
if(j==0) i++;
else i++,j--;
}else{
if(i==7) j++;
else i++,j--;
}
}
}
if(t==0){
for(i=0;i<8;i++){
for(j=0;j<7;j++){
cout<<m[i][j]<<" ";
}
cout<<m[i][j]<<endl;
}
}else if(t==1){
for(int i=0;i<8;i++){
for(int j=0;j<8;j++)
num[i][j]=q[i][j]*m[i][j];
}
for(int i=0;i<8;i++){
for(int j=0;j<7;j++){
cout<<num[i][j]<<" ";
}
cout<<num[i][j]<<endl;
}
}else{
for(i=0;i<8;i++){
for(j=0;j<8;j++){
m[i][j]*=q[i][j];
}
}
double au=0,av=0,sum=0;
int u,v;
for(i=0;i<8;i++){
for(j=0;j<8;j++){
//m[i][j]=m[i][j]*q[i][j];
sum=0;
for(u=0;u<8;u++){
double tempres = 0;
if(u==0) au=sqrt(0.5);
else au=1;
for(v=0;v<8;v++){
if(v==0) av=sqrt(0.5);
else av=1;
sum+=av*au*m[u][v]*cos(acos(-1)/8*(i+0.5)*u)*cos(acos(-1)/8*(j+0.5)*v)/4;
}
}
mm[i][j]=int(sum+128+0.5);
if(mm[i][j]>255) mm[i][j]=255;
else if(mm[i][j]<0) mm[i][j]=0;
}
}
for(i=0;i<8;i++){
for(j=0;j<7;j++){
cout<<mm[i][j]<<" ";
}
cout<<mm[i][j]<<endl;
}
}
return 0;
}
/*
#include<bits/stdc++.h>
using namespace std;
int Q[8][8];
double M[8][8];
double MM[8][8];
int n;
int T;
int N[70];
int index;
void t2(){
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
if((i+j)%2==0){//偶数
if(i+j<=7){
index = (i+j)*(i+j+1)/2+j;
M[i][j] = N[index];
}
else{
index = 36+(23-i-j)*(-8+i+j)/2+7-i;
M[i][j] = N[index];
}
}
else{//奇数
if(i+j<=7){
index = (i+j)*(i+j+1)/2+i;
M[i][j] = N[index];
}
else{
index =36+ (23-i-j)*(-8+i+j)/2+7-j;
M[i][j] = N[index];
}
}
}
}
int j=0;
for(int i=0;i<8;i++){
for(j=0;j<8;j++)
{M[i][j]*=Q[i][j];
cout<<M[i][j]<<" ";
}
cout<<M[i][j]<<endl;}
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
double tempres = 0;
for(int u=0;u<8;u++){
for(int v=0;v<8;v++){
double temptempres = M[u][v];
if(u==0) temptempres*=sqrt(0.5);
if(v==0) temptempres*=sqrt(0.5);
temptempres*=cos(acos(-1)/8*(i+0.5)*u)*cos(acos(-1)/8*(j+0.5)*v);
tempres += temptempres;
}
}
MM[i][j] = tempres/4;
cout<<MM[i][j]<<endl;
MM[i][j] =+128;
if(MM[i][j]>=255) MM[i][j] = 255;
else if(MM[i][j]<=0) MM[i][j] = 0;
else MM[i][j] = round(MM[i][j]);
}
}
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
M[i][j] = MM[i][j];
}
int main(){
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
cin>>Q[i][j];
cin>>n>>T;
for(int i=0;i<n;i++) cin>>N[i];
if(T==2) t2();
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
cout<<M[i][j]<<" ";}
cout<<endl;}
}
*/
该代码实现了一个JPEG解码过程,包括读取矩阵、进行矩阵运算以及根据不同的时间限制条件输出不同形式的结果。程序首先读取两个8x8的矩阵,然后根据给定的步长和方向进行操作。如果时间限制为0,直接输出原矩阵;为1,则进行矩阵乘法;为2时,进行更复杂的图像处理操作,涉及余弦变换和像素值的调整,确保结果在0-255范围内。

224

被折叠的 条评论
为什么被折叠?



