问题背景
问题描述
输入格式
输出格式
样例输入
样例输出
样例说明
子任务
提示
解决方案
这题是近几次最简单的大模拟了,唯一难点就是数据的Z字型扫描,懒得找规律可以直接打表,也很快。这种大模拟题问题背景基本不用看,直接从问题描述开始,句子翻译成代码。
#include<iostream>
#include<cmath>
#include<algorithm>
#define PI acos(-1)
using namespace std;
double Q[10][10]; //量化矩阵
double M[10][10];
int n,T;//扫描数据的个数、将要进行的任务
int a[66]={0,0,1,2,1,0,0,1,2,3,4,3,2,1,0,0,1,2,3,4,5,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,2,3,4,5,6,7,7,6,5,4,3,4,5,6,7,7,6,5,6,7,7};
int b[66]={0,1,0,0,1,2,3,2,1,0,0,1,2,3,4,5,4,3,2,1,0,0,1,2,3,4,5,6,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7,7,6,5,4,3,2,3,4,5,6,7,7,6,5,4,5,6,7,7,6,7};
double C[10][10];
void yuxianbianhuan(){
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
double ans=0;
for(int u=0;u<8;u++){
for(int v=0;v<8;v++){
double a=1;
double b=1;
if(u==0) a=sqrt(0.5);
if(v==0) b=sqrt(0.5);
double temp=a*b*M[u][v]*cos((PI/8)*(i+0.5)*u)*cos((PI/8)*(j+0.5)*v);
ans+=temp;
}
}
ans=ans/4;
C[i][j]=ans;
}
}
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
M[i][j]=C[i][j]+128;
M[i][j]=round(M[i][j]);
if(M[i][j]>255){
M[i][j]=255;
}
if(M[i][j]<0){
M[i][j]=0;
}
}
}
}
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>>M[a[i]][b[i]];
}
if(T==0){
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
cout<<M[i][j]<<" ";
}
cout<<endl;
}
}
else if(T==1){
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
M[i][j]*=Q[i][j];
cout<<M[i][j]<<" ";
}
cout<<endl;
}
}
else{
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
M[i][j]*=Q[i][j];
}
}
yuxianbianhuan();
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
cout<<M[i][j]<<" ";
}
cout<<endl;
}
}
return 0;
}