华为OD机试_2025 B卷_猜数字(Python,100分)(附详细解题思路)

题目描述

一个人设定一组四码的数字作为谜底,另一方猜。

每猜一个数,出数者就要根据这个数字给出提示,提示以XAYB形式呈现,直到猜中位置。

其中X表示位置正确的数的个数(数字正确且位置正确),而Y表示数字正确而位置不对的数的个数。

例如,当谜底为8123,而猜谜者猜1052时,出题者必须提示0A2B。

例如,当谜底为5637,而猜谜者才4931时,出题者必须提示1A0B。

当前已知N组猜谜者猜的数字与提示,如果答案确定,请输出答案,不确定则输出NA。

输入描述
第一行输入一个正整数,0<N < 100。

接下来N行,每一行包含一个猜测的数字与提示结果。

输出描述
输出最后的答案,答案不确定则输出NA。

用例

输入6
4815 1A1B
5716 0A1B
7842 0A1B
4901 0A0B
8585 3A0B
8555 2A1B
输出3585
说明

猜数字游戏解题思路(确定谜底数字)

一、核心解题思路

问题分析
题目要求根据多组猜测和对应的XAYB提示(X表示数字和位置都正确的个数,Y表示数字正确但位置不对的个数),确定唯一的四位数谜底:

  1. 输入包含N组(猜测数字, XAYB提示)
  2. 谜底是四位数(取值范围1000~9999)
  3. 需要验证候选谜底是否满足所有提示
  4. 输出规则:
  • 唯一满足条件的谜底 → 输出该数字
  • 多个满足条件 → 输出"NA"
  • 无满足条件 → 输出"NA"

关键策略

  1. 候选谜底生成:遍历1000~9999所有四位数
  2. 提示验证:对每个候选谜底检查是否满足所有XAYB提示
  3. XAYB计算
  • 计算数字和位置都正确的数量(A)
  • 计算数字正确但位置错误的数量(B)
  1. 结果筛选:记录所有满足条件的谜底,根据数量决定输出
二、完整代码实现
def calculate_A_B(candidate, guess):"""计算候选谜底与猜测的A和B值"""candidate_str = str(candidate)guess_str = str(guess)# 计算A(位置和数字都正确)A = 0for i in range(4):if candidate_str[i] == guess_str[i]:A += 1# 计算B(数字正确但位置错误)candidate_digits = {}guess_digits = {}# 统计未匹配位置的数字频率for i in range(4):if candidate_str[i] != guess_str[i]:candidate_digits[candidate_str[i]] = candidate_digits.get(candidate_str[i], 0) + 1guess_digits[guess_str[i]] = guess_digits.get(guess_str[i], 0) + 1B = 0for digit in guess_digits:if digit in candidate_digits:B += min(guess_digits[digit], candidate_digits[digit])return A, Bdef main():import sysdata = sys.stdin.read().splitlines()if not data:  # 处理空输入print("NA")returnn = int(data[0])guesses = []# 解析输入数据for i in range(1, n + 1):if i >= len(data):  # 确保数据行存在breakparts = data[i].split()if len(parts) < 2:  # 确保有猜测和提示continueguess_num = parts[0]hint = parts[1]# 确保提示格式正确if len(hint) != 3 or hint[1] != 'A' or not hint[0].isdigit() or not hint[2].isdigit():continue# 提取A和B的值A_val = int(hint[0])B_val = int(hint[2])guesses.append((guess_num, A_val, B_val))solutions = []# 遍历所有可能的四位数候选for candidate in range(1000, 10000):candidate_str = str(candidate)valid = True# 检查是否满足所有猜测条件for guess_num, A_val, B_val in guesses:A, B = calculate_A_B(candidate_str, guess_num)if A != A_val or B != B_val:valid = Falsebreakif valid:solutions.append(candidate_str)# 输出结果if len(solutions) == 0:print("NA")elif len(solutions) == 1:print(solutions[0])else:print("NA")if __name__ == "__main__":main()
三、算法原理解析

1. A值计算

A = 0
for i in range(4):
if candidate[i] == guess[i]:
A += 1
  • 直接比较相同位置的数字
  • 完全匹配时计数增加

2. B值计算

# 统计未匹配位置的数字频率
for i in range(4):
if candidate[i] != guess[i]:
candidate_digits[candidate[i]] += 1
guess_digits[guess[i]] += 1# 计算共同数字的最小频率
B = 0
for digit in guess_digits:
if digit in candidate_digits:
B += min(guess_digits[digit], candidate_digits[digit])
  • 排除已匹配位置(A值位置)
  • 统计剩余数字的出现频率
  • 取相同数字的最小频率作为B值

3. 候选验证
对每个候选谜底:

  1. 遍历所有猜测提示
  2. 计算候选谜底与当前猜测的A、B值
  3. 与提示的A、B值比对
  4. 任意提示不匹配即淘汰该候选
四、示例解析

输入示例

6
4815 1A1B
5716 0A1B
7842 0A1B
4901 0A0B
8585 3A0B
8555 2A1B

验证过程(以候选3585为例):

  1. 4815 → 计算:A=1(第4位5匹配),B=1(8在候选第3位) → 匹配1A1B
  2. 5716 → 计算:A=0,B=1(5在候选第2,4位) → 匹配0A1B
  3. 7842 → 计算:A=0,B=1(8在候选第3位) → 匹配0A1B
  4. 4901 → 计算:A=0,B=0 → 匹配0A0B
  5. 8585 → 计算:
  • A=3(第2位5、第3位8、第4位5匹配)
  • B=0 → 匹配3A0B
  1. 8555 → 计算:
  • A=2(第2位5、第4位5匹配)
  • B=1(8在候选第3位) → 匹配2A1B

结果输出:3585

图解说明

候选谜底:3 5 8 5猜测4815:
3≠4, 5≠8, 8≠1, 5=5 → A=1
未匹配:候选[3,5,8], 猜测[4,8,1] → 共同数字8 → B=1猜测5716:
3≠5, 5=5(匹配A不参与B), 8≠1, 5≠6 → A=0
未匹配:候选[3,8,5], 猜测[7,1,6] → 无共同数字 → B=0(但实际计算有5?注意匹配的5已排除)
修正:候选未匹配[3,8,5]中的5在候选第4位(未匹配位置),猜测中未匹配的7,1,6 → 无共同 → B=0?
但题目提示0A1B → 矛盾?重新计算5716:
候选:3 5 8 5
猜测:5 7 1 6
位置1:3≠5 → 未匹配
位置2:5=5 → 匹配(A=1?但题目提示0A)
位置3:8≠1 → 未匹配
位置4:5≠6 → 未匹配
因此A=1(位置2)≠0 → 不符合0A1B问题:题目实际输入是5716 0A1B,但候选3585在位置2匹配(5),A应该为1但实际运行结果3585符合所有条件,说明题目中提示是准确的。重新检查题目:"第二组:5716 -> 0A1B
3 vs 5 -> 不同
5 vs 7 -> 不同
8 vs 1 -> 不同
5 vs 6 -> 不同 -> A=0
候选未匹配位置:3,5,8,5 (注意:谜底3585,所以未匹配位置是全部:3,5,8,5,频率:3:1,5:2,8:1)
猜测未匹配位置:5,7,1,6
5:在频率表中(出现2次),所以B=1,然后频率表中5变成1次(5:1)。
7:不在频率表中,跳过。
1:不在,跳过。
6:不在,跳过。
所以B=1,提示0A1B符合。"关键点:位置2的5在候选中是5,在猜测中也是5,但为什么算未匹配?
因为题目要求"位置正确"才计入A,位置2的候选是5,猜测是7?实际猜测5716:
位置1:5(猜测) vs 3(候选) → 不匹配
位置2:7(猜测) vs 5(候选) → 不匹配
位置3:1(猜测) vs 8(候选) → 不匹配
位置4:6(猜测) vs 5(候选) → 不匹配
所以A=0,不是1先前错误认为猜测是"5716"对应位置2是5,实际是7结论:3585满足所有条件
五、总结

算法特点

  1. 暴力枚举:遍历所有可能四位数候选(1000~9999)
  2. 精确验证:通过A/B值计算严格匹配提示
  3. 高效处理
  • 时间复杂度:9000×N×4 ≈ 3.6×10⁶(N≤100)
  • 空间复杂度:O(1)
  1. 鲁棒性强:正确处理重复数字场景

关键要点

  • A值计算:位置和数字完全匹配
  • B值计算
  • 排除已匹配位置
  • 频率统计共同数字
  • 取最小值保证不重复计数
  • 结果筛选
  • 唯一解 → 输出数字
  • 多解/无解 → 输出"NA"

应用场景

  • 猜数字游戏AI
  • 密码破解系统
  • 数据验证工具
  • 游戏测试自动化

该解法通过系统枚举和精确验证,高效解决了猜数字游戏的谜底确定问题,能正确处理各种边界情况和重复数字场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/91183.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络安全】理解安全事件的“三分法”流程:应对警报的第一道防线

1. 简介 在网络安全领域&#xff0c;每天都会产生大量安全警报。作为一名安全分析师&#xff0c;识别、评估并优先处理这些警报的能力至关重要。三分法&#xff08;Triage&#xff09; 是确保安全团队高效响应安全事件的核心流程&#xff0c;它能够帮助我们合理分配资源、集中精…

AI大模型计数能力的深度剖析:从理论缺陷到技术改进

AI大模型计数能力的深度剖析&#xff1a;从理论缺陷到技术改进 AI大模型在计数任务上表现出明显的局限性&#xff0c;这不仅反映了模型架构的核心缺陷&#xff0c;也揭示了当前深度学习技术在处理结构化信息时的本质挑战。通过对文本计数、图像计数以及相关技术改进方向的全面分…

[C语言初阶]结构体初阶

目录一、结构体的声明二、结构体的定义和初始化三、结构体成员访问四、结构体传参五、函数调用的参数压栈&#xff08;了解&#xff09;在C语言中&#xff0c;我们知道数组是一组相同类型元素的集合&#xff0c;而结构体则更为灵活&#xff0c;它允许我们将不同类型的数据组合在…

LVS(Linux Virtual Server)集群技术详解

一.集群和分布式: 集群&#xff1a;同一个业务系统&#xff0c;部署在多台服务器上&#xff0c;集群中&#xff0c;每一台服务器实现的功能没有差别&#xff0c;数据和代码都是一样的 分布式&#xff1a;一个业务被拆成多个子业务&#xff0c;或者本身就是不同的业务&#…

leetcode_27 移除元素

1. 题意 给定一个数组&#xff0c;把不等于val的元素全部移动到数组的前面来。 不需要考虑值为val里的元素。 2. 题解 2.1 同向双指针 我们利用双指针&#xff0c;慢指针指向下一个插入的位置。而快指针不断向前找到首个不为val的值&#xff0c;找到后将快指针位置值赋给慢…

Linux-Ubuntu下的git安装与配置

一、安装git1.打开终端&#xff0c;运行以下命令&#xff08;需要联网&#xff09;sudo apt-get update sudo apt-get install git2.验证安装安装完成之后&#xff0c;通过运行以下命令验证git是否已经正确安装&#xff1a;git --version二、配置git2.1.配置用户名及邮箱地址在…

2D和3D激光slam的点云去运动畸变

在使用激光雷达设备采集点云的时候&#xff0c;我们都知道&#xff0c;激光雷达是边运动边采集的&#xff0c;每一个点云采集时的激光雷达的中心和姿态都是不一样的&#xff0c;如果不加以矫正&#xff0c;那么这一帧数据就会出现问题&#xff0c;比如采集一个平面的结构的时候…

Java 热门面试题 200 道(Markdown表格版)【简化版】

Java 热门面试题 200 道(Markdown表格版)【简化版】 Java与数据库核心面试题摘要 本文精选200道Java与数据库高频面试题,重点涵盖: Java集合: HashMap原理(数组+链表/红黑树)、ConcurrentHashMap分段锁优化、红黑树改进目的(解决哈希冲突性能问题) MySQL索引: 最左前…

OpenCV探索之旅:多尺度视觉与形状的灵魂--图像金字塔与轮廓分析

在我们学会用Canny算法勾勒处世界的轮廓之后&#xff0c;一个更深层次的问题摆在了面前&#xff1a;这些由像素组成的线条&#xff0c;如何才能被赋予“生命”&#xff0c;成为我们能够理解和分析的“形状”&#xff1f;如果一个物体在图像中时大时小&#xff0c;我们又该如何稳…

Redis作缓存时存在的问题及其解决方案

Redis最常用的一个场景就是作为缓存&#xff0c;本文主要探讨Redis作为缓存&#xff0c;在实践中可能会有哪些问题&#xff1f;比如一致性, 穿击, 穿透, 雪崩, 污染等。 为什么要理解Redis缓存问题 在高并发的业务场景下&#xff0c;数据库大多数情况都是用户并发访问最薄弱的…

day17 力扣654.最大二叉树 力扣617.合并二叉树 力扣700.二叉搜索树中的搜索 力扣98.验证二叉搜索树

最大二叉树给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。返回 nums 构建的 最大…

天地图前端实现geoJson与wkt格式互转

geoJson与wkt都是WebGIS开发中经常用到的格式&#xff0c;天地图行政区划边界接口返回的是wkt格式数据&#xff0c;需要转换一下。 安装插件&#xff1a;terraformer/wkt npm install terraformer/wkt 两个函数&#xff1a; .wktToGeoJSON(WKT) ⇒ object.geojsonToWKT(Geo…

(1-7-3)数据库的基本查询

目录 1. 数据库的基本查询 1.1 简单的记录查询 1.2 使用列别名 2. 数据分页查询 &#xff08;1&#xff09;查询前五行数据 &#xff08;2&#xff09;查询 11 ~ 15 行数据 3. 结果集排序 3.1 单关键字排序 &#xff08;1&#xff09;升序排列 &#xff08;2&#…

宝塔配置pgsql可以远程访问及pdo_pgsql扩展的安装

本地navicat premium 17.0 可以远程访问pgsql v16.1宝塔的软件商店里&#xff0c;找到pgsql管理器&#xff1b;在pgsql管理器里找到客户端认证&#xff1a;第二步&#xff1a;配置修改&#xff0c;CtrlF 查找listen_addresses关键字&#xff1b;第三步&#xff1a;在navicat里配…

SQL进阶:自连接的用法

目录 一、可重排列、排列、组合 1、创建表 2、录入数据 3、获取可重排列的商品名称&#xff08;有序&#xff09; 4、获取排列的商品名称&#xff08;有序&#xff09; 5、获取组合的商品名称&#xff08;无序&#xff09; 6、获取3个元素的组合商品名称&#xff08;无序…

Spark集群优化配置指南

Spark集群优化配置指南 &#x1f4cb; 概述 本文档记录了5节点Spark集群的性能优化配置&#xff0c;主要解决Thrift Server内存不足(OOM)问题和CPU资源利用率低的问题。 文档内容 Spark架构原理: Driver与Executor的关系和工作机制Driver内存配置详解: 三个关键内存参数的作用和…

Layui —— select

前言&#xff1a;记录在修改bug时遇到的一些奇怪问题。遇到的奇怪问题1&#xff1a;项目中引入了 layui&#xff0c;而且也使用了 layui.use 按需导入了需要的组件&#xff0c;但是在页面每次刚初始化的时候去使用layui&#xff0c;控制台都会报 组件未定义的问题&#xff08;正…

代码随想录day32dp1

文章目录509. 斐波那契数70. 爬楼梯746. 使用最小花费爬楼梯确定dp数组&#xff08;dp table&#xff09;以及下标的含义 确定递推公式 dp数组如何初始化 确定遍历顺序 举例推导dp数组509. 斐波那契数 题目链接 文章讲解 class Solution { public:int fib(int n) {// 1. 确定…

RedisJSON 技术揭秘`JSON.ARRTRIM`用窗口裁剪,让数组保持“刚刚好”

1、指令速查 JSON.ARRTRIM <key> <path> <start> <stop>key&#xff1a;Redis 键名path&#xff1a;JSONPath&#xff0c;默认 $ 根&#xff1b;可用 .[*]/.. 多路径匹配start / stop&#xff1a;要保留的 [start, stop] 闭区间索引 支持负值&#xff…

fpga调试经验

fpga调试经验 调测场景&#xff1a; 外接adc传感器芯片&#xff0c;采集压力&#xff0c;温度等模拟量&#xff0c;fpga通过spi/i2c接口与adc传感器芯片通信 问题1&#xff1a;adc芯片在稳定环境中&#xff0c;输出数字量不稳定。 结论&#xff1a;adc输入电压由fpga板供应&…