UVa 1091 Barcodes
题目描述Code-11\texttt{Code-11}Code-11是一种用于电信设备标签的条形码系统可编码数字000到999、连字符-以及起始/终止字符。每个字符由555个交替的暗色和亮色条组成以暗色条开始每个条的宽度为窄或宽。字符之间由窄亮色条分隔。条形码以起始字符开始以终止字符结束消息后附加两个校验字符CCC和KKK。给定条形码阅读器检测到的各区域宽度要求解码出原始消息或判断条形码是否无效。输入格式输入包含多个测试用例。每个测试用例第一行是一个整数mmmm≤150m \le 150m≤150表示检测到的区域数量。接下来mmm个整数d1…dmd_1 \ldots d_md1​…dm​1≤di≤2001 \le d_i \le 2001≤di​≤200表示每个区域的传感器数量。数据以暗色条开始和结束。最后一个测试用例后跟一个整数000。输出格式对于每个测试用例输出一行Case X:后跟解码结果。若成功解码输出消息字符序列不含校验字符。若CCC校验字符错误输出bad C若KKK校验字符错误输出bad K若条形码因宽度超出允许范围、起始/终止码缺失或其他无效条件而无法解码输出bad code。样例输入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 10 20 20 10样例输出Case 1: 123-45 Case 2: bad code Case 3: bad K题目分析本题要求解码Code-11\texttt{Code-11}Code-11条形码。每个字符由555个条组成字符之间由111个窄亮色条分隔。完整的条形码结构为起始字符555条分隔条111条消息字符每个555条之间111条分隔分隔条CCC校验字符555条分隔条KKK校验字符555条分隔条终止字符555条。总区域数mmm满足m51(n2)×6−15m 5 1 (n2) \times 6 - 1 5m51(n2)×6−15需要仔细计算。起始字符555条然后分隔条111条然后每个消息字符555条加分隔条111条共nnn个消息字符然后CCC校验字符555条加分隔条111条然后KKK校验字符555条加分隔条111条最后终止字符555条。总数为51n×66656n295 1 n \times 6 6 6 5 6n 2951n×66656n29。因此mmm必须满足m≥29m \ge 29m≥29且(m−29) mod 60(m-29) \bmod 6 0(m−29)mod60。解码步骤将检测到的区域宽度分类为窄或宽。由于宽条宽度约为窄条的两倍且存在±5%\pm 5\%±5%的误差需要确定阈值。首先找到所有区域的最小值narrownarrownarrow和最大值widewidewide取中间值middle(narrowwide)/2middle (narrow wide) / 2middle(narrowwide)/2。对于每个区域若其值小于middlemiddlemiddle则认为是窄条否则认为是宽条。但为了处理误差还需验证宽窄比例是否在允许范围内将所有窄条值乘以222然后重新计算最小值和最大值检查wide×95≤narrow×105wide \times 95 \le narrow \times 105wide×95≤narrow×105是否成立。若不成立则输出bad code。将每个区域映射为000窄或111宽得到二进制串。检查起始和终止字符是否为00110。若正向不匹配尝试反向因为条形码可能从右向左扫描。若仍不匹配输出bad code。检查每个字符之间的分隔条是否均为窄条即对应位置为0。若不满足输出bad code。提取每个字符的555位编码查表得到对应的数字或连字符。若编码不在表中输出bad code。计算CCC校验字符设消息字符为c1,…,cnc_1, \ldots, c_nc1​,…,cn​权重w(ci)w(c_i)w(ci​)为数字000到999对应000到999连字符为101010。CCC的权重为(∑i1n((n−i) mod 101)×w(ci)) mod 11\left(\sum_{i1}^{n} ((n-i) \bmod 10 1) \times w(c_i)\right) \bmod 11(∑i1n​((n−i)mod101)×w(ci​))mod11。若计算值与解码得到的CCC不符输出bad C。计算KKK校验字符将CCC视为第n1n1n1个字符权重公式为(∑i1n1((n−i1) mod 91)×w(ci)) mod 11\left(\sum_{i1}^{n1} ((n-i1) \bmod 9 1) \times w(c_i)\right) \bmod 11(∑i1n1​((n−i1)mod91)×w(ci​))mod11。若计算值与解码得到的KKK不符输出bad K。若全部通过输出消息字符序列。解题思路首先根据区域数量判断基本格式是否正确。然后通过阈值将宽度二值化。为了处理打印误差先计算所有区域的最小值和最大值取中间值作为初始阈值。将小于阈值的区域视为窄条大于等于阈值的视为宽条。但为了更精确可以将所有窄条的值乘以222来模拟宽条然后重新计算最小值和最大值检查宽条与窄条的比例是否在95%95\%95%到105%105\%105%之间。若不满足则条形码无效。接着将二值化后的序列拼接成字符串。检查起始和终止的555位是否为00110。由于扫描方向可能相反若正向不匹配则反转字符串再检查。然后检查所有分隔条位置是否为0。接着按每666位一组555位字符111位分隔提取字符编码查表转换为数字。若遇到未知编码输出bad code。解码完成后根据公式计算CCC和KKK校验值与解码得到的校验字符比较。注意CCC校验使用消息字符KKK校验使用消息字符加上CCC字符。若CCC错误输出bad C若KKK错误输出bad K。全部正确则输出消息字符不含校验字符。时间复杂度为O(m)O(m)O(m)空间复杂度为O(m)O(m)O(m)对于m≤150m \le 150m≤150非常高效。代码实现#includebits/stdc.husingnamespacestd;intmain(intargc,char*argv[]){cin.tie(0),cout.tie(0),ios::sync_with_stdio(false);intbar[160],m,cases0;string flag00110;string characters0123456789-;mapstring,intencoding{{00001,0},{10001,1},{01001,2},{11000,3},{00101,4},{10100,5},{01100,6},{00011,7},{10010,8},{10000,9},{00100,10}};while(cinm,m0){coutCase cases: ;for(inti0;im;i)cinbar[i];if(m29||(m-29)%6!0){coutbad code\n;continue;}intwide,narrow;wide0,narrow0x3f3f3f3f;for(inti0;im;i)widemax(wide,bar[i]),narrowmin(narrow,bar[i]);doublemiddle(narrowwide)/2.0;wide0,narrow0x3f3f3f3f;for(inti0;im;i){intv0;if(bar[i]middle)vbar[i]*2;elsevbar[i];widemax(wide,v),narrowmin(narrow,v);}if(wide*95narrow*105){coutbad code\n;continue;}string code;narrowbar[0],wide2*narrow;for(inti0;im;i){if(bar[i]middle)code0;elsecode1;}boolgoodcode.substr(0,5)flagcode.substr(code.length()-5)flag;if(!good){reverse(code.begin(),code.end());goodcode.substr(0,5)flagcode.substr(code.length()-5)flag;}if(!good){coutbad code\n;continue;}for(inti5;icode.length();i6)if(code[i]!0){goodfalse;break;}if(!good){coutbad code\n;continue;}vectorintdigits;for(inti6;icode.length()-5;i6){string blockcode.substr(i,5);if(encoding.find(block)encoding.end()){goodfalse;break;}digits.push_back(encoding[block]);}if(!good){coutbad code\n;continue;}intndigits.size()-2,mod0;for(inti1;in;i)mod((n-i)%101)*digits[i-1];mod%11;if(mod!digits[n]){coutbad C\n;continue;}ndigits.size()-1,mod0;for(inti1;in;i)mod((n-i)%91)*digits[i-1];mod%11;if(mod!digits[n]){coutbad K\n;continue;}for(inti0;idigits.size()-2;i)coutcharacters[digits[i]];cout\n;}return0;}总结本题的核心在于Code-11\texttt{Code-11}Code-11条形码的解码过程包括宽度二值化、起始/终止码识别、分隔条验证、字符查表以及双重校验。关键点在于处理打印误差时通过将窄条宽度乘以222来模拟宽条并验证宽窄比例是否在允许范围内。同时需要支持反向扫描即当正向解码失败时尝试反转序列。校验公式中注意取模运算的优先级和范围。整体算法思路清晰实现细节较多适用于题目给定的约束条件。

相关新闻

SpringBoot+Vue校园二手交易平台架构设计与实践

SpringBoot+Vue校园二手交易平台架构设计与实践

1. 项目背景与核心价值校园二手交易平台是近年来高校信息化建设的重要组成部分。每到毕业季,大量教材、电子产品、生活用品被低价转卖或直接丢弃,而新生又需要重新购置这些物品。这种资源错配现象在各大高校普遍存在。我去年协助某高校学生会开发的闲置交…

2026/10/15 21:04:08 阅读更多 →
MFC C++安全解析XML:COM初始化、编码转换与XPath实战

MFC C++安全解析XML:COM初始化、编码转换与XPath实战

简介:本资源是一套基于MFC平台的C XML解析完整工程实现,面向Windows桌面开发初学者与中级C程序员,解决在传统MFC项目中高效读写、查询及维护XML数据的实际问题。资源以ATL的IXMLDOMDocument接口为核心,完整封装了XML加载、XPath遍…

2026/10/15 21:04:08 阅读更多 →
YV12视频渲染实战:D3D9/D3D11双路径与像素着色器颜色转换

YV12视频渲染实战:D3D9/D3D11双路径与像素着色器颜色转换

简介:一套基于Direct3D的YUV视频显示源代码,面向Windows平台下的图形与视频开发者。工程以YV12为核心,同时兼容I420、NV12、YUY2、UYVY以及多种RGB格式,可借助GPU Shader完成色彩空间转换与渲染,并支持半透明文本叠加。…

2026/10/15 21:04:08 阅读更多 →

最新新闻

一招教你解决deepseek不能识别图片的问题:用TaoToken统一Key接入qwen3-vl-plus多模态

一招教你解决deepseek不能识别图片的问题:用TaoToken统一Key接入qwen3-vl-plus多模态

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 21:58:08 阅读更多 →
Qt试用期授权方案:时间制、次数制与权限分级的防绕过实践

Qt试用期授权方案:时间制、次数制与权限分级的防绕过实践

简介:面向软件开发者与产品经理的试用期授权参考包,聚焦试用天数、使用次数及正式授权管理,可用于桌面软件试用策略的设计与验证。压缩包共38个文件,包含25个DLL运行库、9个QM多语言翻译文件、3个EXE程序(含测试验证用…

2026/10/15 21:58:08 阅读更多 →
工业设备远程维护的关键:物联网无线通信网关选型与实施指南

工业设备远程维护的关键:物联网无线通信网关选型与实施指南

厂房里有二十多台设备,分布在不同车间,老中青三代都有。前几年做远程维护管理系统,最难的不是平台上那些看板、工单和告警逻辑,而是怎么让这些“不会说话”的老设备把运行状态递出来。折腾了一圈,最后发现整个系统里最…

2026/10/15 21:58:08 阅读更多 →
Django实战:重庆零售业数据分析可视化系统开发全攻略

Django实战:重庆零售业数据分析可视化系统开发全攻略

毕业设计年年都有人卡在同一个地方:题目选得很大,做完却发现只是在拼凑代码;数据量看着唬人,最后演示时图表却加载不出来。如果你正打算做一套数据分析可视化系统,或者已经在写这类毕设,那么这个项目——基…

2026/10/15 21:58:08 阅读更多 →
从零构建TCP加密文件传输系统:粘包、断点续传与AES-GCM实战

从零构建TCP加密文件传输系统:粘包、断点续传与AES-GCM实战

1. 从零搭建一套TCP加密文件传输系统,我为什么放弃了现成方案 文件传输这件事,看起来简单,真要做到"自己可控、数据不裸奔",坑比想象中多。我最初的需求很朴素:在两台机器之间传一些体积不小的文件&#xff…

2026/10/15 21:58:08 阅读更多 →
机器视觉课设实战:OpenCV传统算法实现鲁棒工件识别

机器视觉课设实战:OpenCV传统算法实现鲁棒工件识别

简介:本资源是天津工业大学机器视觉课程期末实践项目,面向高校自动化、测控、人工智能等专业本科生,聚焦工业场景下的精密尺寸测量问题。学生基于MATLAB实现钢销图像的预处理、边缘检测与亚像素级直径计算,并通过实验报告系统呈现…

2026/10/15 21:57:06 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →