| 2025年第一届哈尔滨工业大学程序设计竞赛一校三区联合校赛 |
|---|
| Finished |
QR Code 是日常生活中常用的一种二维码,可视为记录数据信息的黑白像素矩阵,信息的形式为 01 比特串,黑色方格代表 1,白色方格代表 0。QR Code 现有 40 个版本,版本 1 的大小为 21 × 21,版本 40 的大小为 177 × 177,越大则可容纳的信息量越多。QR Code 提供数字模式,字母数字模式,字节模式等多种模式来记录数据信息。QR Code 还具备纠错功能,有 L、M、Q、H 这 4 个纠错级别,级别越高纠错能力越强,但能容纳的数据量就越少。
本题研究 QR Code 最简单的结构:QR Code 版本 1,采用数字模式,H 纠错级别,其结构如下图所示:
该结构是一个 21 × 21 的 01 矩阵,左上角坐标为 (0, 0),左下角坐标为 (20, 0),右上角坐标为 (0, 20),右下角坐标为 (20, 20)。其中黑色方格表示值固定为 1;白色方格表示值固定为 0;深灰色方格表示的值与模式和纠错级别有关,本题采用数字模式,H 纠错级别,表示的值和上图所示一致,即上图中深灰色方格填 1 则表示值为 1,填 0 则表示值为 0;浅灰色方格表示的值与存储的数据信息有关,需要通过以下几个步骤确定:
其中,第二步生成纠错码字需要计算生成多项式的系数,并根据生成多项式计算出余数多项式的系数。该过程较为复杂,因此本题省略前两个步骤,输入数据将直接给出第二步完成后的数据码字和纠错码字,总共为 26 个码字 c1, c2, ..., c26 (0 ≤ ci ≤ 255),你需要根据这 26 个码字的值实现后两个步骤,并输出最终的二维码结构。
第三步为码字比特流绘制。如下图所示,浅灰色方格总共有 208 个,从右下角开始按 S 形划分为 C1 到 C26 共 26 个区域,每个区域占 4 行 2 列共 8 个方格,区域 Ci 所填的值由码字 ci 决定。每个区域内的格子编号为
,若区域编号方向由下至上(图中蓝色箭头所示),则区域内左上角格子编号为 0,右下角格子编号为 7,如区域 C1, C16 所示;若区域编号方向由上至下(图中绿色箭头所示),则区域内左下角格子编号为 0,右上角格子编号为 7,如区域 C4, C19 所示。区域中编号
的格子所填的值为将 ci 转换成 8 位二进制数后第
位上的值。例如,数据信息 114514 经第二步完成后 c3 = 114,转换为 8 位二进制数即为 01110010,其中第 1, 4, 5, 6 位为 1,第 0, 2, 3, 7 位为 0,因此区域 C3 编号为 1, 4, 5, 6 的格子填 1,编号为 0, 2, 3, 7 的格子填 0。
![]() | ![]() |
第四步为掩膜图案绘制。本题采用的掩膜图案表达式为
,即对于坐标为 (i, j) 的浅灰色方格,第三步的所填值与
异或后的结果为最终所填值。其中 [P] 表示当 P 为真时结果为 1,当 P 为假时结果为 0。请注意,只有浅灰色方格进行掩膜操作,而黑色、白色和深灰色方格都不进行掩膜操作。
现在请编写一个程序作为二维码生成器,输入数据码字和纠错码字,输出对应的 21 × 21 二维码,请用字符
表示值为 1 的方格,字符
表示值为 0 的方格。
输入共三行,26 个整数,表示码字 c1, c2, ..., c26 (0 ≤ ci ≤ 255)。
第一行,输入 10 个整数,表示前 10 个码字 c1, c2, ..., c10。
第二行,输入 10 个整数,表示中间 10 个码字 c11, c12, ..., c20。
第三行,输入 6 个整数,表示后 6 个码字 c21, c22, ..., c26。
输出共 21 行,每行为 21 个字符
或
构成的字符串,表示 21 × 21 的二维码。
16 24 114 128 128 236 17 236 17 72 228 6 59 233 77 169 40 48 215 80 206 191 120 191 244 59
#######.#.#.#.####### #.....#...###.#.....# #.###.#...#...#.###.# #.###.#.##.#..#.###.# #.###.#..#.##.#.###.# #.....#....##.#.....# #######.#.#.#.####### ...........##........ ..#.###.##...#...#..# .#.#...#.........#### .#...##..###..#.#.#.# ..#.#...##.#.##..#..# .#.#.####.###.#.#.### ........#.#...##.###. #######...#....#..#.. #.....#.#.###..###... #.###.#.#..#..##..#.# #.###.#..##.##....##. #.###.#.##....#.#...# #.....#...#.#.....#.. #######..#..#...#.#.#
输入样例为数据信息 114514 所对应的码字,若将输出样例中的字符
换成黑色方格,字符
换成白色方格,得到的 21 × 21 二维码如下图所示(赛后大家可以用手机微信上的"扫一扫"等扫码软件扫描,均可以扫出 114514):
| Name |
|---|


