熱門文章

2025年8月10日 星期日

ZeroJudge 解題筆記:c276. 沒有手機的下課時間

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


ZeroJudge 題目連結:c276. 沒有手機的下課時間

解題想法


其實就是猜數字。先掃過一次,找出位置、數字皆正確的部分,再掃過一次,找出數字對、位置錯的部分。

Python 程式碼


使用時間約為 18 ms,記憶體約為 3.3 MB,通過測試。
ans = input()  # 答案
n = int(input())  # 猜測次數
for _ in range(n):  # 執行 n 次
    guess = input()  # 猜測的數字
    a, b = 0, 0  # 位置數字皆正確的個數 a,只有數字正確的個數 b
    ar, gr = [], []  # ans 及 guess 中檢測完位置及數字後剩下的部分
    for i in range(4):  # 先掃過一次
        if guess[i] == ans[i]:  # 位置數字皆正確
            a += 1  # a 加 1
        else:  # 否則將此位數加入 ar 及 gr
            ar.append(ans[i])
            gr.append(guess[i])
    for g in gr:  # 由 gr 依序取出數字
        if g in ar:  # 如果 ar 之中有 g 
            b += 1  # b 加 1
            ar.pop(ar.index(g))  # 將 ar 之中的 g 移除一個
    print(f"{a:d}A{b:d}B")  # 印出答案


C++ 程式碼


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

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    string ans; cin >> ans;  // 答案
    int n; cin >> n;  // 猜測次數
    for(int i=0; i<n; i++) {  // 執行 n 次
        string guess; cin >> guess;  // 猜測的數字
        int a = 0, b = 0;  // 位置數字皆正確的個數 a,只有數字正確的個數 b
        bool ar[4] = {false}, gr[4] = {false};  // ans 及 guess 中檢測完位置及數字後剩下的部分
        for(int j=0; j<4; j++) {  // 先掃過一次
            if (guess[j] == ans[j]) {  // 位置數字皆正確
                a++;  // a 加 1
            } else {  // 
                ar[j] = true; gr[j] = true;
            }
        }
        for(int j=0; j<4; j++) {  // 檢測只有數字正確的部分
            if (!gr[j]) continue;  // 如果 gr[j] 為 false,找下一位
            for(int k=0; k<4; k++) {  // 依序檢查 ar
                if (ar[k] && guess[j] == ans[k]) {  // 如果 ar[k] 為 true 而且 guess[j] == ans[k]
                    b++;  // b 加 1
                    ar[k] = false;  // 將 ar[k] 改為 fasle,避免之後重覆檢測
                    break;  // 跳出 for 迴圈
                }
            }
        }
        cout << a << "A" << b << "B\n";  // 印出答案
    }
    return 0;
}

<

沒有留言:

張貼留言