这是一道比较简单的题。如果直接从正面解题,因为约束条件非常繁琐,所以实现起来比较麻烦。由于4位数只有10000-1000个,并且测试的数据不超过100组,所以可以采取枚举的方法,对每个四位数进行N次判断,如果N个条件全部符合,则说明当前四位数可能是正确答案。
(!!!注意题目问的是能否确定这个四位数)
#include <iostream>
using namespace std;
int a[101],b[101],c[101];//猜的数为a[i]、猜对了b[i]个数字、c[i]个在正确的位置
int ans=0;//符合条件的四位数
//判断当前四位数是否符合第y次问答的结果
bool check(int x,int n)
{
int s[4],t[4];//当前四位数及第y次猜测的四位数
int pa=a[n];
for(int i=3;i>=0;i--)
{
s[i]=x%10,x/=10;
t[i]=pa%10,pa/=10;
}
int check_num=0,check_pos=0;//猜对数字的个数、正确位置的个数
//计算正确位置的个数
for(int i=0;i<4;i++)
if(s[i]==t[i]) check_pos++;
//计算猜对数字的个数
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(s[i]==t[j])
{
check_num++;
t[j]=-1;//防止一个数字被多次判断
break;
}
}
}
return check_num==b[n]&&check_pos==c[n];
}
int main()
{
int n;
while(cin>>n&&n)//每组n次问答
{
for(int i=0;i<n;i++)
cin>>a[i]>>b[i]>>c[i];
ans=0;//答案的初值记为0
//枚举每一个值,并判断是否符合条件
for(int i=1000;i<10000;i++)
{
int num=0;
for(;num<n;num++)
if(!check(i,num)) break;//不符合条件则直接退出循环
if(num==n)//下面是符合条件的
{
if(ans!=0)//此时说明有多个可能的解
{
ans=-1;//多个解的标志
cout<<"Not sure"<<endl;
break;
}
ans=i;
}
}
if(ans==0)//此时说明无解
cout<<"Not sure"<<endl;
else if(ans!=-1)//只有1一个解
cout<<ans<<endl;
}
return 0;
}