这题刚开始我同样也没思路,只能爬博客了............彻底明白思路后写下如下代码:
/*暴力枚举所有4位数的情况,注意题目中输入n,有n组测试数据,所以把没组存放在数组中,a[]存放四位数,b[]存放正确的四位数与猜测四位数的相等数字的个数,c[]存放位置相同数字也相同的个数.......,注意pipei(),与cishu()两个函数*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define Max 101
int cishu(int a,int b,int c){
int temp1[4],temp2[4];
int count=0;
int visit[4]; //用于标记,防止将一个树重复计算个数
memset(visit,0,sizeof(visit));
for(int i=0;i<4;i++){
temp1[i]=a%10;
a/=10;
temp2[i]=b%10;
b/=10;
}
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if( visit[j]==0 && temp1[i]==temp2[j]){ //这一位数没有出现过,并且在正确数字中存在
count++;
visit[j]=1; //标记已寻找到,防止重复寻找
break;
}
}
}
if(count==c)
return 1;
else
return 0;
}
int pipei(int a,int b,int c){
int count=0;
int temp1[4],temp2[4];
for(int i=3;i>=0;i--){
temp1[i]=a%10;
a/=10;
temp2[i]=b%10;
b/=10;
if(temp1[i]==temp2[i])
count++;
}
if(count==c)
return 1;
else
return 0;
}
int main(){
int a[Max],b[Max],c[Max];
int count,result;
int n,i,j;
while(scanf("%d",&n) && n){
count=0;
for(i=0;i<n;i++){
scanf("%d%d%d",&a[i],&b[i],&c[i]);
}
for(i=1000;i<=9999;i++){ //暴力枚举所有四位数,并与猜测的数字进行比较
for(j=0;j<n;j++){
if(cishu(i,a[j],b[j])==0)
break;
if(pipei(i,a[j],c[j])==0)
break;
}
if(j>=n){ //可以确定一个数,满足所有的猜测条件
count++;
result=i;
}
if(count>=2) //当满足条件的数不止一个时直接终止循环
break;
}
if(count==1)
printf("%d\n",result);
else
printf("Not sure\n");
}
system("pause");
}