csp认证JPEG 解码 问题提问

#202212-3 JPEG 解码题目问题

目前已经可以拿到40分,在离散余弦变化时按照题目条件进行计算,和网上满分代码对比也大致相同,但输出就是有问题(这里

我只输出了经过变化后没有+128和取整计算的部分)
代码如下

#include<bits/stdc++.h>
using namespace std;
int q[8][8],m[8][8];
int data[64];
double pi8 = acos(-1)/8.0,m2[8][8];
void read_scan_data_1(int n)
{
    //填充图像矩阵方法一:总共只有64个元素,可以直接将走位表直接枚举出来
    int idx[8][8] = {{0, 1, 5, 6, 14, 15, 27, 28},
                     {2, 4, 7, 13, 16, 26, 29, 42},
                     {3, 8, 12, 17, 25, 30, 41, 43},
                     {9, 11, 18, 24, 31, 40, 44, 53},
                     {10, 19, 23, 32, 39, 45, 52, 54},
                     {20, 22, 33, 38, 46, 51, 55, 60},
                     {21, 34, 37, 47, 50, 56, 59, 61},
                     {35, 36, 48, 49, 57, 58, 62, 63}};
    for(int i = 0;i < 8;i ++){
        for(int j = 0;j < 8;j ++){
            m[i][j] = data[idx[i][j]];
        }
    }
}
void read_scan_data_2(int n)
{
    //填充矩阵方法二:找规律版
    int i = 0,j = 0,k = 1;  //(i,j)为当前方位,k指示前进方向为右上方还是左下方
    for(int x = 0;x < n;x ++){
        m[i][j] = data[x];
        if(k == 1){
            //如果向右上方推进,斜对角(左下右上)线两侧的例外分别是i=0和j=7
            if(i == 0) j++, k = -1;    //注意更改方向
            else if(j == 7) i ++,k = -1;
            else i --,j ++;
        }
        else{
            //如果向左下方推进,斜对角线两侧的例外分别是i=7和j=0
            if(i == 7) j ++, k = 1;
            else if(j == 0) i ++, k = 1;
            else i ++,j --;
        }
    }
}
double alpha(int u)
{
    if(u == 0) return sqrt(0.5);
    else return 1;
}
int cast(int x)
{
    if(x < 0) return 0;
    if(x > 255) return 255;
    return x;
}
int main()
{
    for(int i = 0;i < 8;i ++){
        for(int j = 0;j < 8;j ++){
            cin>>q[i][j];
        }
    }
    int n; cin>>n;
    int T; cin>>T;

    for(int i = 0;i < n;i ++) cin>>data[i];
    //读入填充数据
    read_scan_data_2(n);

    //量化
    for(int i = 0;i < 8;i ++){
        for (int j = 0;j < 8;j ++){
            m2[i][j] = m[i][j] * q[i][j];
        }
    }



    if(T == 0){
        for(int i = 0;i < 8;i ++){
            for(int j = 0;j < 8;j ++)
                cout<<m[i][j]<<" ";
            cout<<endl;
        }
    }
    else if(T == 1){
        //输出量化后的矩阵
        for(int i = 0;i < 8;i ++){
            for (int j = 0;j < 8;j ++){
                cout<<m2[i][j]<<" ";
            }
            cout<<endl;
        }
    }
    else{
        for(int i = 0;i < 8;i ++){
            for (int j = 0;j < 8;j ++){
                double cnt = 0;
                for(int u = 0;u < 8;u ++){
                    for(int v = 0;v < 8;v ++){
                        double coefficient = alpha(u) * alpha(v);
                        cnt += coefficient * m2[u][v] * cos(pi8 *(i + 0.5)*u)*cos(pi8 *(j + 0.5)*v);
                    }
                }
                //m2[i][j] = cast(round(cnt/4.0 + 128));
                m2[i][j] = cnt/4.0;
                cout<<m2[i][j]<<" ";
            }
            cout<<endl;
        }

    }
    return 0;
}

输出结果如下:

img


官网结果如下:

img

【以下回答由 GPT 生成】

问题描述中没有提到具体的输出问题,所以无法确定需要优化的具体部分。但从代码中可以看出,read_scan_data_1函数是用来填充图像矩阵的,可能出错的地方可能在于对于q[x][y]m[dx][dy]的赋值。以下是我的优化建议:

  1. 首先,你可以在函数前面添加注释,说明函数的具体作用和输入输出,以及对应的数据格式。

c++ /** * @brief 从给定的data数组中填充图像矩阵q和m * @param n: data数组的大小 * @return 无 */ void read_scan_data_1(int n) { // ... }

  1. idx数组的定义上方,添加注释解释该数组的作用和含义。

c++ /** * @brief q和m矩阵坐标索引对应data数组的索引 */ int idx[8][8] = { // ... };

  1. 在代码中通过适当的注释,解释一些关键变量和计算的含义,使得代码更加易懂。

  2. 进行输入的检查,确保输入的大小和格式符合要求。

```c++ void read_scan_data_1(int n) { if (n != 64) { // 输入数据大小错误,抛出异常或返回错误代码 return; }

   // ...

} ```

  1. 检查赋值语句的正确性,尤其是对于data数组和qm矩阵的索引。

```c++ void read_scan_data_1(int n) { // ...

   for (int i = 0; i < n; i++) {
       int x = i / 8, y = i % 8;
       // 检查idx数组的边界问题
       if (x >= 8 || y >= 8) {
           // 抛出异常或返回错误代码
           return;
       }

       int dx = idx[x][y] / 8, dy = idx[x][y] % 8;
       // 检查data数组的边界问题
       if (idx[x][y] >= 64) {
           // 抛出异常或返回错误代码
           return;
       }

       q[x][y] = data[idx[x][y]] - 128;
       m[dx][dy] = q[x][y];
   }

   // ...

} ```

请根据以上建议进行代码优化,并在出现错误时进行适当的异常处理或错误代码返回。如果以上优化不能解决问题,请提供更具体的问题描述。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^