CSP202212-3:JPEG 解码
#include <bits/stdc++.h>
using namespace std;
double Q[10][10];//量化矩阵
double M0[10][10];//T=0输出矩阵
double M1[10][10];//T=1输出矩阵
double M2[10][10];//T=2输出矩阵
//使用double,我一开始用float做了好久都只能得80分
#define pi acos(-1)
int main()
{
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
cin >> Q[i][j];
int n, T;
cin >> n >> T;
int sx = 0, sy = 0;
double *ci = new double[n + 1];
for (int i = 0; i < n; i++)
cin >> ci[i];
//录入M0矩阵,通过观察图形发现规律,确定sx,sy得到下一个要填充的位置
for (int i = 0; i < n && i < 64; i++)
{
M0[sx][sy] = ci[i];
if (i < 35)//前35个和后面规律不同,看图就可以看出来
{
if (sx == 0 && sy == 0)
{
sy++;
}
else if (sx == 0)
{
// lj++;
if (sy % 2 == 1)
{
sx++;
sy--;
}
else
{
sy++;
}
}
else if (sy == 0)
{
// li++;
if (sx % 2 == 1)
{
sx++;
}
else
{
sx--;
sy++;
}
}
else if ((sx + sy) % 2 == 1)
{
sx++;
sy--;
}
else if ((sx + sy) % 2 == 0)
{
sx--;
sy++;
}
}
else
{
if (sx == 7)
{
if (sy % 2 == 1)
{
sx--;
sy++;
}
else
sy++;
}
else if (sy == 7)
{
if (sx % 2 == 1)
sx++;
else
{
sx++;
sy--;
}
}
else if ((sx + sy) % 2 == 1)
{
sx++;
sy--;
}
else if ((sx + sy) % 2 == 0)
{
sx--;
sy++;
}
}
}
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
M1[i][j] = M0[i][j] * Q[i][j];
//计算M2矩阵
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
{
for (int u = 0; u < 8; u++)
{
for (int v = 0; v < 8; v++)
{
float au, av;
if (u == 0)
au = sqrt(0.5);
else
au = 1.0;
if (v == 0)
av = sqrt(0.5);
else
av = 1.0;
M2[i][j] += (double)(0.25 * M1[u][v] * au * av * cos(pi * (i + 0.5) * u / 8.0) * cos(pi * (j + 0.5) * v / 8.0));
}
}
//四舍五入
M2[i][j] = round(M2[i][j] + 128);
if (M2[i][j] > 255)
M2[i][j] = 255;
else if (M2[i][j] < 0)
M2[i][j] = 0;
}
if (T == 0)
{
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
cout << M0[i][j] << " ";
cout << endl;
}
}
else if (T == 1)
{
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
cout << M1[i][j] << " ";
cout << endl;
}
}
else if (T == 2)
{
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
cout << M2[i][j] << " ";
cout << endl;
}
}
}