熱門文章

2025年10月25日 星期六

ZeroJudge 解題筆記:f821. nAnB ( 正常版 )

作者:王一哲
日期:2025年10月25日


ZeroJudge 題目連結:f821. nAnB ( 正常版 )

解題想法


這題的數字不會重複,寫起來簡單很多。假設數字、位置皆相同的數量為 a,數字相同、位置不同的數量為 b,依序讀取猜測字串中的每個字元,先比較這個字元與答案中同樣位置的字元是否相同,如果相同則 a 加 1;如果前一個條件不成立,再檢查這個數字是否在答案當中,如果有則 b 加 1。

Python 程式碼


使用時間約為 19 ms,記憶體約為 3.3 MB,通過測試。
ans, m = input().split()  # 正確答案,詢問筆數
n = len(ans)  # 答案的字數
for _ in range(int(m)):  # 執行 m 次
    guess = input()  # 猜測的數字
    a, b = 0, 0  # 數字、位置皆正確的數量,數字正確、位置錯誤的數量
    for i, c in enumerate(guess):  # 依序取出 guess 的數字
        if ans[i] == c: a += 1  # 數字、位置皆正確
        elif c in ans: b += 1  # 數字正確、位置錯誤
    print(f"{a:d}A{b:d}B")


C++ 程式碼


使用時間約為 3 ms,記憶體約為 352 kB,通過測試。
#include <iostream>
#include <string>
using namespace std;

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    string ans; int m; cin >> ans >> m;  // 正確答案,詢問筆數
    int n = (int)ans.size();  // 答案的字數
    for(int i=0; i<m; i++) {  // 執行 m 次
        string guess; cin >> guess;  // 猜測的數字
        int a = 0, b = 0;  // 數字、位置皆正確的數量,數字正確、位置錯誤的數量
        for(int j=0; j<n; j++) {  // 依序取出 guess 的數字
            if (ans[j] == guess[j]) a++;  // 數字、位置皆正確
            else if (ans.find(guess[j]) != string::npos) b++;  // 數字正確、位置錯誤
        }
        cout << a <<"A" << b << "B\n";
    }
    return 0;
}


沒有留言:

張貼留言