CSP202212-3

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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值