参考了b站的up主“圣斗士-DS-ALGO”,并完善了后续
#include <bits/stdc++.h>
using namespace std;
const double pi=acos(-1.0);
struct p
{
int x;
int y;
}p[64]={
{0,0},
{0,1},{1,0},
{2,0},{1,1},{0,2},
{0,3},{1,2},{2,1},{3,0},
{4,0},{3,1},{2,2},{1,3},{0,4},
{0,5},{1,4},{2,3},{3,2},{4,1},{5,0},
{6,0},{5,1},{4,2},{3,3},{2,4},{1,5},{0,6},
{0,7},{1,6},{2,5},{3,4},{4,3},{5,2},{6,1},{7,0},
{7,1},{6,2},{5,3},{4,4},{3,5},{2,6},{1,7},
{2,7},{3,6},{4,5},{5,4},{6,3},{7,2},
{7,3},{6,4},{5,5},{4,6},{3,7},
{4,7},{5,6},{6,5},{7,4},
{7,5},{6,6},{5,7},
{6,7},{7,6},
{7,7}
};//用p[i]结构体使输入顺序固定
int M[8][8];
int Q[8][8];
double M1[8][8];
int M2[8][8];
int main()
{
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
cin>>Q[i][j];
M[i][j]=0;
M2[i][j]=0;
M1[i][j]=0.0;
}
}
int n;
cin>>n;
int t;
cin>>t;
for(int i=0;i<n;i++)
{
cin>>M[p[i].x][p[i].y];//按照固定顺序输入
}
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
M2[i][j]=Q[i][j]*M[i][j];
}
}
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
float au=0.0,av=0.0;
for(int u=0;u<8;u++)
{
if(u==0)
{
au=sqrt(0.5);
}
else{
au=1;
}
for(int v=0;v<8;v++)
{
if(v==0)
{
av=sqrt(0.5);
}
else{
av=1;
}
M1[i][j]+=0.25*au*av*M2[u][v]*cos(pi*0.125*(i+0.5)*u)*cos(pi*0.125*(j+0.5)*v);
}
}
M1[i][j]+=128;
/*int tmp=M1[i][j];
double delta=M1[i][j]-tmp;
if(delta>=0.5)
{
M1[i][j]=tmp+1;
}
else{
M1[i][j]=tmp;
}*/
M1[i][j]=round(M1[i][j]);
if(M1[i][j]>255)
{
M1[i][j]=255;
}
if(M1[i][j]<0)
{
M1[i][j]=0;
}
}
}
if(t==0)
{
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
cout<<M[i][j]<<" ";
}
cout<<endl;
}
}
if(t==1)
{
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
cout<<M2[i][j]<<" ";
}
cout<<endl;
}
}
if(t==2)
{
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
cout<<M1[i][j]<<" ";
}
cout<<endl;
}
}
return 0;
}