華為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
英文地址,請注明出處:http://en.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板供應&…