题解
题目整体思路还是比较简单的,也没有用到什么算法,只是我的办法需要稍微注意下边界。最大的难点应该是转化那个公式。
四舍五入:round()
#include <iostream>
using namespace std;
#include <bits/stdc++.h>
#include<algorithm>
int shu[9][9];
int sao[9][9];
int m[65];
double tran(int i, int j)
{
double res = 0;
for (int u = 0; u <= 7; u ++ )
{
double au=1;if(u==0)au=sqrt(0.5);
double a=cos(acos(-1)*(i+0.5)*u/8.0);
for (int v = 0; v <= 7; v ++ )
{
double b=cos(acos(-1)*(j+0.5)*v/8.0);
double av=1;if(v==0)av=sqrt(0.5);
res=res+av*au*a*b*sao[u][v];
}
}
res=round(res/4.0)+128;
if(res<=0)res=0;
if(res>=255)res=255;
return res;
}
int main()
{
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)cin>>shu[i][j];
int cnt;cin>>cnt;
int T;cin>>T;
for(int i=1;i<=cnt;i++)cin>>m[i];
int i=0,j=0;
sao[0][0]=m[1];int yi=2;
while(1)
{
if(yi>cnt)break;
if((i==0)&&(j%2)==0&&j!=7)//注意i=0和j=7重合的部分
{
j++;sao[i][j]=m[yi++];
int re=j;
for(int k=1;k<=re;k++)
{
i++;j--;
sao[i][j]=m[yi++];
}
}
else if((j==0)&&(i%2)==1&&i!=7)
{
i++;sao[i][j]=m[yi++];
int re=i;
for(int k=1;k<=re;k++)
{
i--;j++;
sao[i][j]=m[yi++];
}
}
else if((i==7)&&(j%2)==0)
{
j++;sao[i][j]=m[yi++];
int re=j;
for(int k=1;k<=(7-re);k++)
{
i--;j++;
sao[i][j]=m[yi++];
}
}
else if((j==7)&&(i%2)==1)
{
i++;sao[i][j]=m[yi++];
int re=i;
for(int k=1;k<=(7-re);k++)
{
i++;j--;
sao[i][j]=m[yi++];
}
}
}
if(T==0)
{
for(int i=0;i<=7;i++)
{
for(int j=0;j<=7;j++)
{
cout<<sao[i][j]<<" ";
}
cout<<endl;
}
}
if(T>0)
{
for(int i=0;i<=7;i++)
{
for(int j=0;j<=7;j++)
{
sao[i][j]*=shu[i][j];
if(T==1)cout<<sao[i][j]<<" ";
}
if(T==1)cout<<endl;
}
}
if(T==2)
{
for(int i=0;i<=7;i++)
{
for(int j=0;j<=7;j++)
{
cout<<tran(i,j)<<" ";
}
if(i<7)cout<<endl;
}
}
return 0;
}