QOJ.ac

QOJ

Time Limit: 1.0 s Memory Limit: 256 MB Total points: 100

#13131. 条形码

Statistics

Code-11 是一种主要用于标记电信设备的条形码编码系统。编码字符仅限于数字 0 到 9、连字符(“-”)以及出现在每个 Code-11 条形码开头和结尾的特殊起始/终止字符。

Code-11 是一个离散系统,每个字符独立编码。一个字符的编码由五个相邻的区域(即条)表示,这些条在深色和浅色之间交替,并以深色条开始。根据下方的编码方案,每个条的宽度要么是窄的,要么是宽的,其中 0 代表窄条,1 代表宽条。

字符 编码
0 00001
1 10001
2 01001
3 11000
4 00101
5 10100
6 01100
7 00011
8 10010
9 10000
00100
起始/终止 00110

因此,字符 1 被编码为:宽深条、窄浅条、窄深条、窄浅条,最后是宽深条。单个字符的条形码必须由一个窄浅条隔开,该窄浅条的唯一功能是分隔字符。

像 Code-11 这样使用双宽度编码具有简单性的优点。由于只需要区分窄条和宽条,Code-11 在低质量打印条件下具有很高的打印容差。

为了实现错误检测,我们使用的 Code-11 条形码在消息末尾(终止字符之前)添加了两个校验字符 C 和 K。如果待编码的 $n$ 个字符(从左到右)为 $c_1$ 到 $c_n$,则校验字符 C 的权重为:

$$\left( \sum_{i=1}^{n} ((n - i) \bmod 10 + 1) \times w(c_i) \right) \bmod 11$$

其中 $w(c_i)$ 是与字符 $c_i$ 关联的权重。数字 0 到 9 的权重为 0 到 9;连字符的权重为 10。(注意:$\bmod$ 的优先级高于 $+$。)

校验字符 K 的权重为:

$$\left( \sum_{i=1}^{n+1} ((n + 1 - i) \bmod 9 + 1) \times w(c_i) \right) \bmod 11$$

其中 $c_{n+1}$ 是校验字符 C。例如,假设要编码的消息是 123–45。那么校验字符 C 为 5,校验字符 K 为 2。这八个字符 123–4552 的条形码,在前后加上起始/终止字符的条形码,构成了该消息完整的 Code-11 条形码编码。

简单的条形码阅读器通过测量从条形码反射的光强度来工作,反射光被线性排列的数百个微小 CCD 传感器接收,每个传感器报告光或暗。软件识别出明暗区域,并利用每个区域的宽度来验证条形码并获取编码信息。由于条形码的方向不固定,软件必须能够解码从左向右或从右向左扫描的条形码。

你的任务是根据阅读器检测到的明暗区域宽度,解码扫描 Code-11 条形码所获得的信息。假设宽条的预期宽度是窄条的两倍。由于打印机的不一致性,条的宽度可能比预期值大或小最多 5%。不存在零长度的消息(条形码仅包含起始/终止字符、校验字符和字符间距)。

输入格式

输入包含多个测试用例,每个用例代表一次扫描尝试。每个用例的数据以一个整数 $m \le 150$ 开头,指定了条形码阅读器检测到的区域数量。随后是 $m$ 个整数 $d_1 \dots d_m$ ($1 \le d_i \le 200$),给出了每个区域中传感器的数量(在同一区域内,所有传感器报告相同的光强度)。每个测试用例的数据以深色条开始并以深色条结束(没有前导或尾随的空白)。

最后一个测试用例后跟一个整数 0。

输出格式

对于每个输入用例,显示一行包含用例编号和解码结果。如果条形码可以成功解码,则显示消息字符序列(不包含校验字符)。如果解码成功但校验字符 C 不正确,则显示 “bad C”。如果解码成功且校验字符 C 正确但校验字符 K 不正确,则显示 “bad K”。如果由于条宽度超出允许范围、缺少或无效的起始/终止代码或其他无效条件导致条形码无法成功解码,则显示 “bad code”。请遵循样例输出的格式。

样例

输入 1

59 
10 20 20 10 10 10 20 10 10 20 
10 10 10 10 20 10 20 10 10 10 
20 10 20 10 20 10 20 10 10 10 
10 10 20 10 10 10 10 10 10 20 
20 10 20 10 10 20 10 10 20 10 
10 10 20 10 10 20 20 10 10 
35 
10 10 10 10 10 10 10 10 10 10 
10 10 10 10 10 10 10 10 10 10 
10 10 10 10 10 10 10 10 10 10 
10 10 10 10 10 
35 
10 10 20 20 10 10 20 10 10 10 
20 10 10 20 10 10 20 10 10 10 
20 10 20 10 20 10 10 10 10 10 
10 10 20 20 10 
0

输出 1

Case 1: 123-45
Case 2: bad code 
Case 3: bad K

Figure 1. Code-11 条形码示例

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.