本题给的时间非常充裕,所以采用暴力破解。
依次判断 1000 ~ 9999 中满足所有猜测的数的个数。如果恰好为1,则猜测成功;否则无法猜测。
#include <iostream>
#include <algorithm>
using namespace std;
const int BASE = 10;
const int MAXN = 100;
int A[MAXN], B[MAXN], C[MAXN]; //输入
int cnt1[BASE], cnt2[BASE]; //猜对数字的个数
//判断num是否满足第k次猜测
bool judge(int num, int k)
{
memset(cnt1, 0, sizeof(cnt1));
memset(cnt2, 0, sizeof(cnt2));
int cnt = 0; //对应位相同数字的个数
int guess = A[k]; //本次猜测的数
for (int i = 1; i <= 4; i++)
{
int r1 = num % BASE;
int r2 = guess % BASE;
if (r1 == r2) //对应位相同
++cnt;
num /= BASE;
guess /= BASE;
cnt1[r1]++;
cnt2[r2]++;
}
if (cnt == C[k])
{
int sum = 0; //猜对数字的个数
for (int i = 0; i < BASE; i++)
sum += min(cnt1[i], cnt2[i]);
return sum == B[k];
}
else
return false;
}
int main()
{
int N;
int ans, cnt; //最终答案,满足猜测的答案数
while (cin >> N)
{
if (N == 0)
break;
for (int i = 0; i < N; i++)
{
cin >> A[i] >> B[i] >> C[i];
}
ans = cnt = 0;
for (int num = 1000; num < 9999 && cnt < 2; num++)
{
int i;
for (i = 0; i < N; i++) //对num测试所有猜测
{
if (!judge(num, i))
break;
}
if (i == N) //num满足所有猜测
{
++cnt;
ans = num;
}
}
if (cnt == 1) //满足猜测的数的个数为1
cout << ans << endl;
else
cout << "Not sure" << endl;
}
return 0;
}
继续加油。