解题思路:从 1000~9999 枚举给出的案例数,如果其中一个数符合给出的所有案例数,说明此数即为所猜中的数,记录猜中的个数,如果猜中的个数只有唯一的一个说明可以确定此数,否则不能确定此数!
匹配数字时:首先匹配相同位置是否有相同的数,有的话,计数存在数和位置数,然后再匹配一遍位置不相同但存在的数,且记录存在数,最后比较存在数和位置数和给出的存在数和位置数是否相等,相等即为符合!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<map>
#include<cmath>
using namespace std;
int jude(int loc[],int a,int b,int c)
{
int flagl[5],flagt[5];//
int test[5];
int bb=0,cc=0;
memset(flagl,0,sizeof(flagl));
memset(flagt,0,sizeof(flagt));
test[1]=a%10,a/=10;
test[2]=a%10,a/=10;
test[3]=a%10,a/=10;
test[4]=a%10;
for(int i=1;i<=4;i++){
if(loc[i]==test[i]){
flagl[i]=1;// 标记此位置已经匹配过了d
flagt[i]=1;
bb++,cc++;
}
}
for(int i=1;i<=4;i++){
if(flagt[i]==0){
for(int j=1;j<=4;j++){
if(loc[j]==test[i]&&flagl[j]==0){
bb++;
flagl[j]=1;
flagt[i]=1;
break;
}
}
}
}
if(bb==b&&cc==c)
return 1;
return 0;
}
int main()
{
int n,a[105],b[105],c[105],loc[5];
while(cin>>n){
if(n==0){
break;
}
int cnt=0;
int record;
for(int i=0;i<n;i++){
cin>>a[i]>>b[i]>>c[i];
}
for(int i=1000;i<=9999;i++){
int temp=i,flag=1;
loc[1]=temp%10,temp/=10;
loc[2]=temp%10,temp/=10;
loc[3]=temp%10,temp/=10;
loc[4]=temp%10;
for(int j=0;j<n;j++){
if(jude(loc,a[j],b[j],c[j])==0){
flag=0;
}
}
if(flag){
cnt++;
record=i;
}
if(cnt>=2){
break;
}
}
if(cnt==1){
cout<<record<<endl;
}
else
cout<<"Not sure"<<endl;
}
return 0;
}