题目链接计算机软件能力认证考试系统
个人解题思路,进行离散余弦变换时,多创造了一个矩阵tmp_matrix[][]先去处理
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
const int Maxrange = 8;
void ScanMatrix(int mt[][Maxrange],int n)
{
int num = 0;
for (int i = 0; i < 8; i++)
{
if (i % 2 != 0) //向下走
{
for (int x = i; x >= 0; x--)
{
int y = i - x;
if (num < n)
{
cin >> mt[y][x];
num++;
}
else return;
}
}
else
{
for (int y = i; y >= 0; y--)
{
int x = i - y;
if (num < n)
{
cin >> mt[y][x];
num++;
}
else return;
}
}
}
for (int i = 8; i < 15; i++)
{
if (i % 2 != 0) //向下走
{
for (int x = 7; x > 0; x--)
{
int y = i - x;
if (y > 7) break;
if (num < n)
{
cin >> mt[y][x];
num++;
}
else return;
}
}
else
{
for (int y = 7; y >0; y--)
{
int x = i - y;
if (x > 7) break;
if (num < n&&x<=7)
{
cin >> mt[y][x];
num++;
}
else return;
}
}
}
}
void OutputMatrix(int mt[][Maxrange] )
{
for (int i = 0; i < Maxrange; i++)
{
for (int j = 0; j < Maxrange; j++)
{
cout << mt[i][j] << ' ';
}
cout << endl;
}
}
void MultiplyMatrix(int mt[][Maxrange], int qu[][Maxrange])
{
for (int i = 0; i < Maxrange; i++)
{
for (int j = 0; j < Maxrange; j++)
{
mt[i][j] = mt[i][j] * qu[i][j];
}
}
}
void PreOperataionMatrix(int mt[][Maxrange],double tmp[][Maxrange])
{
for (int i = 0; i < Maxrange; i++)
{
for (int j = 0; j < Maxrange; j++)
{
tmp[i][j] = 1;
if (i == 0) tmp[i][j] *= sqrt(0.5);
if (j == 0) tmp[i][j] *= sqrt(0.5);
tmp[i][j] = tmp[i][j]* 0.25*mt[i][j];
}
}
}
void AccumulateMatrix(double tmp[][Maxrange], int mt[][Maxrange])
{
double temp;
int temp_2;
for (int i = 0; i < Maxrange; i++)
{
for (int j = 0; j < Maxrange; j++)
{
temp = 0;
for (int u = 0; u < Maxrange; u++)
{
for (int v = 0; v < Maxrange; v++)
{
temp += tmp[u][v] * cos((acos(-1) / 8) * (i + 0.5) * u) * cos((acos(-1) / 8) * (j + 0.5) * v);
}
}
temp += 128;
temp_2 = round(temp);
if (temp_2 > 255)
mt[i][j] = 255;
else if (temp_2 < 0)
mt[i][j] = 0;
else
mt[i][j] = temp_2;
}
}
}
int main()
{
int quantization_matrix[Maxrange][Maxrange];
int data_matrix[Maxrange][Maxrange] = { 0 };
double tmp_matrix[Maxrange][Maxrange] ;
for (int i = 0; i < Maxrange; i++)
for (int j = 0; j < Maxrange; j++)
cin >> quantization_matrix[i][j];
int n; cin >> n;
int T; cin >> T;
if (T == 0)
{
ScanMatrix(data_matrix, n);
OutputMatrix(data_matrix);
}
else if(T==1)
{
ScanMatrix(data_matrix, n);
MultiplyMatrix(data_matrix, quantization_matrix);
OutputMatrix(data_matrix);
}
else if(T==2)
{
ScanMatrix(data_matrix, n);
MultiplyMatrix(data_matrix, quantization_matrix);
PreOperataionMatrix(data_matrix, tmp_matrix);
AccumulateMatrix(tmp_matrix, data_matrix);
OutputMatrix(data_matrix);
}
}