日期: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;
}
<
沒有留言:
張貼留言