CSP-202212-3 JPEG解码

CSP-JPEG 解码-202212-3 首先从题目本身出发,一起提取关键信息。 阅读详情

V1:循环方式

  • 按照题意一步步实现,命名为step1至6方便对照。
  • 用方向变量记录填充路线,碰到边界后转向。
  • 计算量最大的是逆变换的4层循环。中途不变的表达式提取到外层,但影响不大。
  • print设计为函数模板,输出整型、浮点型矩阵便于调试。
  • 评测结果:正确 100 15ms 4.312MB
#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
using namespace std;

constexpr int K = 8;
int Q[K][K];
int M[K][K];
double P[K][K];

template <typename T>
void print(const T a[K][K]) {
  for(int i = 0; i < K; ++i) {
    for(int j = 0; j < K; ++j) {
      cout << a[i][j] << " \n"[j == 7];
    }
  }
}

int clamp(int x, int lo, int hi) { return (x < lo ? lo : (x > hi ? hi : x)); }

void step1() { // 读入量化矩阵
  for(int i = 0; i < K; ++i) {
    for(int j = 0; j < K; ++j) {
      cin >> Q[i][j];
    }
  }
}

void step3(int n) { // 读入扫描数据,折返填充
  for(int r = 0, c = 0, dir = 'U'; n > 0 && cin >> M[r][c]; --n) {
    if(dir == 'U') { // 斜向左上
      --r;
      if(r < 0) {
        ++r;
        ++c;
        dir = 'D';
      } else {
        ++c;
        if(c >= K) {
          r += 2;
          --c;
          dir = 'D';
        } else {
        }
      }
    } else {
      assert(dir == 'D');
      ++r;
      if(r >= K) {
        --r;
        ++c;
        dir = 'U';
      } else {
        --c;
        if(c < 0) {
          ++c;
          dir = 'U';
        }
      }
    }
  }
}

void step4() {
  for(int i = 0; i < K; ++i) {
    for(int j = 0; j < K; ++j) {
      M[i][j] *= Q[i][j];
    }
  }
}

void step5() {
  const double r2 = sqrt(0.5);
  const double p8 = acos(-1) / K;
  for(int i = 0; i < K; ++i) {
    for(int j = 0; j < K; ++j) {
      for(int u = 0; u < K; ++u) {
        const double a = (u == 0 ? r2 : 1);
        const double c1 = cos(p8 * (i + 0.5) * u);
        for(int v = 0; v < K; ++v) {
          const double b = (v == 0 ? r2 : 1);
          const double c2 = cos(p8 * (j + 0.5) * v);
          P[i][j] += a * b * M[u][v] * c1 * c2;
        }
      }
      P[i][j] /= 4;
    }
  }
}

void step6() {
  for(int i = 0; i < K; ++i) {
    for(int j = 0; j < K; ++j) {
      M[i][j] = clamp(P[i][j] + 128.5, 0, 255);
    }
  }
}

int main() {
  step1();
  // step2: 全局数据自动初始化。
  int n, T; // 扫描数据的个数,任务(步骤)
  cin >> n >> T;
  step3(n);
  if(T >= 1) {
    step4();
  }
  if(T >= 2) {
    step5();
    step6();
  }
  print(M);
  return 0;
}

V2:函数式写法

V1版有多处类似的双层8x8循环,用函数式风格简化:

  • 把双层循环抽象成映射。
  • 将内层动作抽象为多个函数。用lambda表达式也可以。
  • 用索引数组实现折返填充。

整体约缩减一半代码量,但不如V1版直观。

#include <bits/stdc++.h>
using namespace std;

constexpr int K = 8;
const int IDX[] = {0,  1,  8,  16, 9,  2,  3,  10, 17, 24, 32, 25, 18,
                   11, 4,  5,  12, 19, 26, 33, 40, 48, 41, 34, 27, 20,
                   13, 6,  7,  14, 21, 28, 35, 42, 49, 56, 57, 50, 43,
                   36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45,
                   38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63};
int n, T, Q[K][K], M[K][K]; // 扫描数据的个数,任务(步骤)
double P[K][K];
const double r2 = sqrt(0.5);
const double p8 = acos(-1) / 8; // 八分之Pi

template<typename F>
void loop(F f) { // 将函数f映射到8x8矩阵网格上
  for(int i = 0; i < K; ++i) {
    for(int j = 0; j < K; ++j) {
      f(i, j);
    }
  }
}

int clamp(int x, int l, int h) { return x < l ? l : (x > h ? h : x); }
double alpha(int u) { return u == 0 ? r2 : 1; }
double cs(int i, int u) { return cos(p8 * (i + 0.5) * u); }
void load(int i, int j) { cin >> Q[i][j]; }
void scan(int i, int j) { if(n-- > 0) { cin >> M[0][IDX[i * 8 + j]]; } }
void mult(int i, int j) { M[i][j] *= Q[i][j]; }
void bias(int i, int j) { M[i][j] = clamp(P[i][j] + 128.5, 0, 255); }
void dump(int i, int j) { cout << M[i][j] << " \n"[j == 7]; }

void dct(int i, int j) {
  double& e = P[i][j];
  auto converter = [&e, i, j](int u, int v) {
    e += alpha(u) * alpha(v) * M[u][v] * cs(i, u) * cs(j, v);
  };
  loop(converter);
  e /= 4;
}

int main() {
  loop(load); // step 1。全局数据自动初始化,step2略。
  cin >> n >> T;
  loop(scan);
  if(T >= 1) {
    loop(mult); // step 4
  }
  if(T >= 2) {
    loop(dct); // step 5
    loop(bias); // step 6
  }
  loop(dump);
  return 0;
}
保姆级教程:用C++实现JPEG解码核心模块(附CCF-CSP 202212-3满分代码解析) 本文提供了一份详细的C++实现JPEG解码核心模块的保姆级教程,涵盖Z字形填充、量化矩阵操作、离散余弦逆变换(IDCT)和像素值归一化等关键技术。通过工程实践角度解析每个步骤的实现细节和常见陷阱,并附有CCF-CSP 202212-3满分代码解析,帮助开发者深入理解JPEG解码算法。 阅读详情

相关推荐

CCF-CSP第三题总卡壳?以202212-3 JPEG解码为例,拆解矩阵与模拟题的拿分套路

本文以CCF-CSP认证考试2022年12月真题《JPEG解码》为例,详细拆解矩阵类模拟题的解题框架。通过分析Z字形填充、矩阵运算、IDCT实现等关键步骤,提供分阶段验证法和代码组织技巧,帮助考生在认证考试中高效攻克第三题。文章还包含同类题型扩展和考场实战建议,助力提升解题能力。

weixin_42525551的博客 428

【CSP试题回顾】202212-3-JPEG 解码

CSP-202212-3-JPEG 解码。

fzy2003的博客 1373

识别产品外观的合格软件_工业视觉工业质检视觉识别机器视觉视觉检测智能制造工业检测缺陷...

随着工业物联网技术的迅猛发展,掀起了以云计算、大数据、以及人工智能 AI 等信息技术正与传统工业深入融合,由此衍生的 “智能制造4.0” 理念,正在为全球工业带来深远变革。中国的制造业巨头也纷纷借此发力,向智能化、数字化制造演进,实施战略转型。如何高效科学的管理和分析制造业务链上的生产价值,推进制造企业生产工艺优化与产品质量提升是每一个制造企业在数字化、智能化转型过程中的必经之路。业务发展带来的挑...

weixin_42502419的博客 751

CSP 202212-3 JPEG 解码

CSP 202212-3 JPEG 解码

qq_49005782的博客 546

Multisim的探针(Probe)及数字电路的一些调试技巧的应用

Multisim的探针(Probe)及数字电路的一些调试技巧的应用 --EE Bang   By  WRS 上图为555方波发生器,根据R1,R2,C2参数的配置可产生频率为46.3KHZ,占空比50%的方波信号,如果用示波器查看波形参数的话需要用两个坐标轴做差,操作不便,另外如果要修改电路将上述电阻换成滑动变阻器的话,使其产生可变频率

Agent Christmas的博客 3万+

SmsForwarder v6.4.0 + Flask API 实战:5步搭建手机验证码自动化接收服务

本文详细介绍了如何利用SmsForwarder v6.4.0和Flask API构建企业级验证码自动化处理系统。通过5个关键步骤,包括系统架构设计、Android端配置、Flask服务端实现、企业级部署方案以及实战应用场景扩展,帮助开发者高效处理短信验证码,提升自动化测试和数据采集的工作效率。

weixin_30292745的博客 392

CCF-CSP认证考试 202212-3 JPEG 解码 100分题解

循环、矩阵

Pujx的博客 2010

【FPGA的基础快速入门23--------OV5640摄像头VGA显示】

FPGA的基础学习--------OV5640摄像头VGA显示OV5640简介二级目录三级目录 OV5640简介 OV5640同OV7725一样,都是Omni Vision(豪威科技)公司生产的CMOS图像传感器。 OV5640支持更高的分辨率(500W像素)、采集速率,具有更高的图像处理性能,主要应用在手机、数码相机、电脑多媒体等领域。 OV5640支持LED补光、MIPI(移动产业处理器接口)输出接口和DVP(数字视频并行)输出接口选择、ISP(图像信号处理)以及AFC (自动聚焦控制)等功能。 OV

暮雨中的坚果的博客 7688

CCF CSP202212-3JPEG解码

JPEG解码

m0_58941381的博客 391

告别QXDM:在Android Studio中调试与验证高通NV读写功能的完整流程

本文详细介绍了在Android Studio中调试与验证高通NV分区读写功能的完整流程,替代传统的QXDM工具。通过JNI接口层、HAL服务层和Diag通信层的架构设计,开发者可以在熟悉的IDE环境中高效完成NV操作,包括环境配置、错误处理和性能优化等关键实践。

weixin_27013291的博客 261

sid图像数据_遥感影像数据

影像数据基本概念影像数据是由卫星或飞机上的成像系统获得的影像,多为遥感影像数据。影像数据的每个像元都有一个值,表示传感器探测到像素对应地面面积上目标物的电磁辐射强度,也叫亮度值、灰度值。SuperMap支持的影像数据格式有:*.img、*.tif、*.tiff、*.bmp、*.jpg、*.png、*.gif、*.raw、*.sid等。计算机以二进制记录数据,所以其量化的等级以二进制来划分,即2n。...

weixin_39534395的博客 1626

CCF-CSP真题《202212-3 JPEG 解码》思路+python,c++满分题解

本文为大家提供了《202212-3 JPEG 解码》的解题代码,希望对你有帮助~~

weixin_53919192的博客 7537

【Zephyr存储专题】09_LittleFs文件系统操作

本文档旨在为开发者介绍Zephyr下Littlef's文件系统相关配置使用指南

zero的博客 3246

CSP-202212-3-JPEG解码

这题是近几次最简单的大模拟了,唯一难点就是数据的Z字型扫描,懒得找规律可以直接打表,也很快。这种大模拟题问题背景基本不用看,直接从问题描述开始,句子翻译成代码。

Galaxy 402

字节系,ali系,ks,pdd最新抓包方案

各大厂安卓逆向

qq_38759383的博客 1145

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

CCF-CSP 202212-3 JPEG解码

CSP202212-3

weixin_51433674的博客 399

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

CCF-CSP 28次 第三题 【202212-3 JPEG 解码】

CCF-CSP认证 202212-3 JPEG 解码

qq_51879318的博客 1766

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

[PYTHON与CSP的姻缘]202212-3 JPEG 解码

CSP 202212-3 JPEG 解码

山可行,海可平 354

ccf- csp 202212-3 JPEG 解码

ccf- csp 202212-3 JPEG 解码

qssssss79的博客 278

CCF-CSP 202212-3 JPEG 解码

【代码】CCF-CSP 202212-3 JPEG 解码。

plum_sunny的博客 204

CSP-202212-3--->JPEG解码

CSP刷题记录~

weixin_51954774的博客 916

csp认证202212-3 第三题JPEG解码

【代码】csp认证202212-3 第三题JPEG解码。

qq_68005655的博客 205

CSP202212-3JPEG 解码题解(个人纪录)

【代码】CSP202212-3JPEG 解码(个人纪录)

m0_67722125的博客 474

CCF-CSP真题202212-3JPEG解码(Java满分题解)

本题来自2022年12月CCF-CSP真题中第三题《JPEG解码》。

m0_74172965的博客 409
上一篇: 利用文件哈希值进行排重的Python脚本
下一篇: CSP-202303-3 LDAP
CodeArhat
博客等级 码龄15年 13粉丝 38原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值