不過變數好像開的有點多...
此題只需要從0000~9999窮舉,檢查每一個窮舉出來的數字是否和INPUT比較後結果相同
以第一筆測資為例:
6 9793 0/1 2384 0/2 6264 0/1 3383 1/0 2795 0/0 0218 1/0
我們就先用0000去和9793比較,看看結果是否真的為0/1
→ 如果結果相符,就繼續比較2384
→ 如果結果不相符,就代表0000不是解答,所以就換0001去和測資比較
#include <stdio.h>
int main(void)
{
char g[10][5], code[4], ans[5];
int n, t, i, j, k, clue[10][2], flag1[4], flag2[4], num, a, b, sol;
scanf("%d", &n);
while (n--)
{
scanf("%d", &t);
for (i = 0; i < t; i++)
scanf("%s%d/%d", g[i], &clue[i][0], &clue[i][1]);
for (num = sol = 0; num < 10000; num++)
{
for (i = 3, j = num; i >= 0; i--, j /= 10)
code[i] = j % 10 + '0';
for (i = a = b = 0; i < t; i++, a = b = 0)
{
for (j = 0; j < 4; j++)
flag1[j] = flag2[j] = 0;
for (j = 0; j < 4; j++)
if (code[j] == g[i][j])
{
flag1[j] = flag2[j] = 1;
a++;
}
for (j = 0; j < 4; j++)
if (!flag1[j])
for (k = 0; k < 4; k++)
if (!flag2[k] && code[j] == g[i][k])
{
flag1[j] = flag2[k] = 1;
b++;
break;
}
if (a != clue[i][0] || b != clue[i][1])
break;
}
if (i == t)
{
sol++;
for (i = 0; i < 4; i++)
ans[i] = code[i];
ans[4] = '\0';
}
}
if (sol == 1)
puts(ans);
else if (sol > 1)
puts("indeterminate");
else
puts("impossible");
}
return 0;
}
沒有留言:
張貼留言