Test Message

a291: nAnB problem

內容

我們常用數字密碼鎖來保護重要的東西,但要是不小心忘了密碼麻煩就大了!
以四位數字的密碼鎖為例,我們最多要嘗試 10^4=10000 次才能解鎖。這時候要是
有辦法知道目前嘗試的密碼錯了幾個字,那解鎖的速度就快多了。請寫一個程式,
可以判斷每組數字跟正確答案差了幾個字。


輸入

多筆輸入。
第一行有四個介於 0-9 之間的數字,代表正確的密碼
第二行有一個整數 n,1<=n<=10000,代表接下來嘗試 n 組密碼
接下來有 n 行,每行有四個介於 0-9 之間的數字,每行各代表一組嘗試的密碼。

1 2 3 4
4
1 1 4 5
1 2 4 3
1 1 4 4
4 3 2 1

1 1 1 5
4
1 1 1 1
0 9 2 8
1 5 2 3
1 1 5 1

輸出

輸出 n 行。
對於每組嘗試的密碼,若有 p 個數字的值正確,且在正確的位子上,
另外有 q 個數字的值正確,但不在正確的位子上,
輸出 pAqB。
範例見測資。

1A1B
2A2B
2A0B
0A4B
3A0B
0A0B
1A1B
2A2B


解題思路

開兩個陣列 ansCount 和 testCount 分別保留 ans 和 test 無法完全配對的數字。

再來用迴圈判斷,
判斷時會有三種情況

  1. 完全配對 (A)

    A+1

  2. 無法配對,且無法和之前無法配對的數字配對

    把他記錄進無法配對的陣列

  3. 無法配對,但可以和之前無法配對的數字配對 (B)

    B+1 , 把和他配對的數字刪掉

最後輸出得到的 A 和 B 即可。


完整程式碼

AC (0.2s, 96KB)
#include <stdio.h>

int n;
char ans[4], test[4];

int main()
{
while (scanf(" %d %d %d %d %d", &ans[0], &ans[1], &ans[2], &ans[3], &n) == 5)
{
while (n--)
{
char ansCount[10] = { 0 }, testCount[10] = { 0 }, a = 0, b = 0;
scanf(" %d %d %d %d", &test[0], &test[1], &test[2], &test[3]);
for (int i = 0; i < 4; i++)
{
if (test[i] == ans[i])
a++;
else
{
if (ansCount[test[i]])
b++, ansCount[test[i]]--;
else
testCount[test[i]]++;
//
if (testCount[ans[i]])
b++, testCount[ans[i]]--;
else
ansCount[ans[i]]++;
}
}
printf("%dA%dB\n", a, b);
}
}
return 0;
}