当前位置: 首页 > news >正文

2023信奥赛C++提高组csp-s复赛真题及题解:密码锁

2023信奥赛C++提高组csp-s复赛真题及题解:密码锁

题目描述

小 Y 有一把五个拨圈的密码锁。如图所示,每个拨圈上是从0 009 99的数字。每个拨圈都是从0 009 99的循环,即9 99拨动一个位置后可以变成0 008 88

因为校园里比较安全,小 Y 采用的锁车方式是:从正确密码开始,随机转动密码锁仅一次;每次都是以某个幅度仅转动一个拨圈或者同时转动两个相邻的拨圈。

当小 Y 选择同时转动两个相邻拨圈时,两个拨圈转动的幅度相同,即小 Y 可以将密码锁从0 0 1 1 5 \tt{0\;0\;1\;1\;5}00115转成1 1 1 1 5 \tt{1\;1\;1\;1\;5}11115,但不会转成1 2 1 1 5 \tt{1\;2\;1\;1\;5}12115

时间久了,小 Y 也担心这么锁车的安全性,所以小 Y 记下了自己锁车后密码锁的n nn个状态,注意这n nn个状态都不是正确密码。

为了检验这么锁车的安全性,小 Y 有多少种可能的正确密码,使得每个正确密码都能够按照他所采用的锁车方式产生锁车后密码锁的全部n nn个状态。

输入格式

输入的第一行包含一个正整数n nn,表示锁车后密码锁的状态数。

接下来n nn行每行包含五个整数,表示一个密码锁的状态。

输出格式

输出一行包含一个整数,表示密码锁的这n nn个状态按照给定的锁车方式能对应多少种正确密码。

输入输出样例 1
输入 1
1 0 0 1 1 5
输出 1
81
说明/提示

【样例 1 解释】

一共有81 8181种可能的方案。

其中转动一个拨圈的方案有45 4545种,转动两个拨圈的方案有36 3636种。

【数据范围】

对于所有测试数据有:1 ≤ n ≤ 8 1 \leq n \leq 81n8

测试点n ≤ n\leqn特殊性质
1 ∼ 3 1\sim 3131 11
4 ∼ 5 4\sim 5452 22
6 ∼ 8 6\sim 8688 88A
9 ∼ 10 9\sim 109108 88

特殊性质 A:保证所有正确密码都可以通过仅转动一个拨圈得到测试数据给出的n nn个状态。

思路分析

这是一个密码锁推理问题。我们需要找到所有可能的初始正确密码,使得这些密码可以通过恰好一次操作变为给定的n个状态。

核心思路
  1. 问题转化:给定n个状态,每个状态都是由正确密码通过一次操作得到的。我们需要找出所有可能的正确密码。

  2. 操作类型

    • 转动一个拨圈:5个位置,每个位置可以向上/向下转动1~9步(模10运算)
    • 同时转动两个相邻拨圈:4组相邻对,每组可以向上/向下转动1~9步(幅度相同)
  3. 逆向思维:与其枚举所有可能密码(10^5=100000种),然后检查是否能变为所有n个状态,不如从给定的状态反向推导可能的正确密码

算法设计

对于每个给定状态,我们可以枚举所有可能的逆操作

  • 单拨圈逆操作:对每个位置,反向转动1~9步
  • 双拨圈逆操作:对每对相邻位置,反向转动相同的1~9步

这样对每个状态,我们可以得到最多5×9×2 + 4×9×2 = 162个可能的原密码。

由于n很小(≤8),我们可以:

  1. 对第一个状态,生成所有可能的原密码集合S1
  2. 对每个后续状态,生成可能的原密码集合Si
  3. 求所有Si的交集(同时满足所有状态)
  4. 过滤掉与给定状态相同的密码
时间复杂度
  • 最多8个状态
  • 每个状态最多162个可能原密码
  • 求交集复杂度不高
  • 总计算量约100万次操作,完全可行

代码实现

#include<bits/stdc++.h>usingnamespacestd;intn,cnt;inta[10][5];// 存储n个状态intcur[5];// 当前尝试的密码set<int>s,ans;// s用于去重,ans存储最终答案// 将5位密码编码为整数intencode(intx[5]){intres=0;for(inti=0;i<5;i++){res=res*10+x[i];}returnres;}// 检查当前密码cur是否满足所有状态boolcheck(){// 对每个给定状态,检查能否通过一次操作从cur得到它for(inti=0;i<n;i++){boolok=false;// 检查单拨圈操作for(intj=0;j<5;j++){intdiff=(a[i][j]-cur[j]+10)%10;// 转动步数if(diff==0)continue;// 不能不动// 其他位置必须相同boolsame=true;for(intk=0;k<5;k++){if(k==j)continue;if(a[i][k]!=cur[k]){same=false;break;}}if(same){ok=true;break;}}if(ok)continue;// 检查双拨圈操作for(intj=0;j<4;j++){intdiff1=(a[i][j]-cur[j]+10)%10;intdiff2=(a[i][j+1]-cur[j+1]+10)%10;if(diff1==0||diff1!=diff2)continue;// 其他位置必须相同boolsame=true;for(intk=0;k<5;k++){if(k==j||k==j+1)continue;if(a[i][k]!=cur[k]){same=false;break;}}if(same){ok=true;break;}}if(!ok)returnfalse;}returntrue;}// 生成所有可能密码voiddfs(intp){if(p==5){intcode=encode(cur);// 避免重复计算同一个密码if(s.find(code)!=s.end())return;s.insert(code);// 检查是否满足所有状态if(check()){ans.insert(code);}return;}// 枚举当前位置的数字0-9for(inti=0;i<10;i++){cur[p]=i;dfs(p+1);}}intmain(){cin>>n;for(inti=0;i<n;i++){for(intj=0;j<5;j++){cin>>a[i][j];}}// 生成所有可能密码并检查dfs(0);// 输出结果cout<<ans.size()<<endl;return0;}

功能分析

1. 密码编码
  • encode()函数将5位数组编码为整数,便于存储和去重
2. 深度优先搜索
  • dfs()函数枚举所有00000~99999的密码
  • 使用集合s去重(虽然实际上不会重复,因为dfs顺序枚举)
  • 对每个密码调用check()验证
3. 验证函数check()
  • 核心验证逻辑:对每个给定状态,检查能否通过恰好一次操作从当前密码cur得到该状态
  • 单拨圈检查:遍历5个位置,检查是否只有该位置不同且差值为1-9
  • 双拨圈检查:遍历4对相邻位置,检查是否只有这两个位置不同且差值相同(1-9)
  • 必须满足所有n个状态
4. 去重与存储
  • 使用set<int> ans存储所有有效密码,自动去重
  • 最终输出ans.size()得到答案数量

各种学习资料,助力大家一站式学习和提升!!!

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}

1、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html

2、csp信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转

3、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转


GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html

4、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

· 文末祝福 ·

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}
http://www.jsqmd.com/news/332175/

相关文章:

  • 广东佛山橡胶圈优质供应商推荐,益驰O型圈特色揭秘
  • 学术写作的双重挑战:如何用百考通AI同时攻克“重复率”与“AIGC率”
  • 分析北京服务不错的葡萄牙移民专业公司哪家比较靠谱
  • Java springboot基于GIS的旅游信息管理系统(源码+文档+运行视频+讲解视频)
  • Qwen3:8B 模型(通过 Ollama)搭建智能体 - 义美
  • 本科论文“减负”指南:如何让百考通AI成为你的智能学术伙伴
  • 2026年封头品牌推荐:宜兴市宏明机械科技有限公司
  • 告别论文焦虑:百考通AI如何助力本科生高效完成毕业论文
  • 2026年菏泽地区靠谱的百度推广代理商排名,瑞兴广告口碑如何
  • 多智能体协同新突破 反思机制驱动的COPPER框架深度解析
  • 百考通AI:重新定义本科毕业论文写作,一场以学生为本的智能革新
  • DNA甲基化为何是表观遗传研究的核心?
  • 告别论文焦虑:我用百考通AI高效搞定硕士毕业论文的实战分享
  • 2000-2024年 上市公司-平台生态嵌入程度(数据+代码+文献)
  • 2000-2024年 上市公司-融资约束KZ、SA、WW、FC指数(+文献)
  • ACPI!ACPISystemPowerInitializeRootMapping函数分析和ACPI!ACPISystemPowerGetSxD函数分析
  • Transformer模型原理全面详解(通俗易懂)
  • 口碑见证实力:2026年保健食品供应商优选榜单,大牌热销品/大牌保健食品/保健食品集合店,保健食品加盟代理有哪些
  • 洛谷一键跳转vjudge插件
  • 审稿人已无法分辨AI生成与研究者撰写的论文,中山大学、东南大学、兰州大学网安学院导师拆解“真创新”
  • 模型越复杂越不准?2026风电光伏功率预测的“三座误差大山”与破解之道
  • 2026地产开发运营商排名,云桥资管专业团队保障海外投资收益
  • IDEA 免费了,2025.3 版本开始,JetBrains 发布了“统一版”,免费版(即原来的社区版)的功能得到了显著增强,缩小了与旗舰版的差距。
  • 从从52x(521/522)超时错误突围:云上云下双场景排查与通用化解决方案
  • 聊聊靠谱的家用净水器品牌公司,哪家性价比高
  • malloc 在多线程下为什么慢?——从原理到实测
  • 开题卡住了?AI论文写作软件 千笔写作工具 VS PaperRed,本科生专属神器!
  • 2026年国内排行前列的包衣机订制厂家口碑推荐,高效粉碎机/粉碎整粒机/高效包衣机附件/换筒包衣机,包衣机制造厂哪家好
  • AGV智能物流规划公司哪家好,浙江锦舜净化优势突出
  • 学霸同款10个降AI率工具 千笔AI帮你降AIGC