跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

2023 信奥赛 C++ 提高组 CSP-S 复赛真题:密码锁

2023 年信奥赛 CSP-S 提高组密码锁题目解析。题目要求通过旋转五个拨圈上的数字,从初始状态到达目标状态。每个拨圈可独立旋转或与相邻拨圈联动。解题核心采用广度优先搜索(BFS)遍历所有可能状态,记录最短步数。代码实现使用队列管理状态,利用哈希表或数组去重访问标记,确保在有限时间内找到最优解。

remedios发布于 2026/2/4更新于 2026/9/124.4K 浏览
2023 信奥赛 C++ 提高组 CSP-S 复赛真题:密码锁

题目描述

小 Y 有一把五个拨圈的密码锁。如图所示,每个拨圈上是从 0 到 9 的数字。每个拨圈都可以独立旋转,或者与相邻拨圈联动。

每次操作可以选择一个拨圈将其数字加 1 或减 1(模 10),或者选择两个相邻拨圈同时操作。目标是使所有拨圈变为指定目标数字。

给定初始状态和目标状态,求最少需要多少次操作。

输入格式

一行包含 5 个整数,表示初始状态。 下一行包含 5 个整数,表示目标状态。

输出格式

输出一个整数,表示最少操作次数。

解题思路

本题属于典型的广度优先搜索(BFS)问题。由于拨圈数量较少(5 个),每个位置有 10 种可能,总状态空间为 $10^5$,可以通过 BFS 遍历所有可达状态。

  1. 状态表示:使用字符串或数组存储当前 5 个拨圈的数字。
  2. 队列管理:将初始状态加入队列,记录步数。
  3. 去重标记:使用哈希表或数组记录已访问状态,避免重复计算。
  4. 扩展规则:对当前状态的每个拨圈尝试 +1、-1 操作,若达到目标则返回步数。

参考代码

#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <unordered_set>
using namespace std;

int main() {
    string start, target;
    cin >> start >> target;
    
    queue<pair<string, int>> q;
    unordered_set<string> visited;
    
    q.push({start, 0});
    visited.insert(start);
    
    while (!q.empty()) {
        auto [curr, steps] = q.front();
        q.pop();
        
        if (curr == target) {
            cout << steps << endl;
            return 0;
        }
        
        for (int i = 0; i < 5; ++i) {
            // 尝试 +1
            string next = curr;
            next[i] = (next[i] - '0' + 1) % 10 + '0';
            if (visited.find(next) == visited.end()) {
                visited.insert(next);
                q.push({next, steps + 1});
            }
            // 尝试 -1
            next = curr;
            next[i] = (next[i] - '0' + 9) % 10 + '0';
            if (visited.find(next) == visited.end()) {
                visited.insert(next);
                q.push({next, steps + 1});
            }
        }
    }
    return 0;
}

总结

密码锁问题通过状态压缩和 BFS 可以高效求解。注意处理边界情况如数字回绕(9+1=0)。

目录

  1. 题目描述
  2. 输入格式
  3. 输出格式
  4. 解题思路
  5. 参考代码
  6. 总结

更多推荐文章

查看全部
  • 基于 Python 的动物识别技术实现与代码示例
  • C++ 输入输出详解(上):基础流与格式控制
  • Flutter 组件 inappwebview_cookie_manager 适配鸿蒙 HarmonyOS 实战:Cookie 安全与跨域隔离
  • macOS Tahoe 26 回退至 Sequoia 15 的完整方案
  • C++ 面向对象:深入解析继承机制
  • Spring Cloud 微服务:使用 OpenFeign 优雅实现远程调用
  • Feishu-OpenAI 余额查询与监控:实时掌握 Token 消耗情况
  • 天工 AI 辅助产品经理工作流程与多模态功能体验
  • Linux 下 FFmpeg C++ 音视频解码与推流实战
  • 海康视频插件浏览器弹窗及灰屏问题解决方案
  • 主成分回归与偏最小二乘回归深度对比
  • 基于 IsaacLab 的机器人行走训练指南
  • 基于问财热度榜单的 Python 量化筛选实战
  • Python 基础入门:数据类型、运算符与文件处理
  • AIGC 赋能艺术创作:探索新机遇
  • 鸿蒙分布式智能办公应用架构设计与性能优化
  • Python 股票数据接口教程:使用 mootdx 获取行情与财务数据
  • SpringBoot多租户实战:动态数据源与租户隔离
  • 归并排序详解:分治策略与 C 语言实现
  • 《大模型应用开发极简入门》:GPT-4 与 ChatGPT 应用开发指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online