本题采用的是暴力搜索法,在1000至9999中寻找满足已经给出的那些数的情况,看看是不是每一个都符合,如果有这样的数且在1000到9999中只有一个,那么就是这个数,如果有多个,那么这个数就是不确定的数
#include<stdio.h> #include<string.h> struct node { int number,lock,sum; }per[150]; int Check(int n,int m) { int a[4],b[4],sign[4],i,j,sumn; for(i=0;i<4;i++) sign[i]=0; a[0]=n/1000; a[1]=(n/100)%10; a[2]=(n/10)%10; a[3]=n%10; b[0]=per[m].number/1000; b[1]=(per[m].number/100)%10; b[2]=(per[m].number/10)%10; b[3]=per[m].number%10; sumn=0; for(i=0;i<4;i++)//判断位置相同数 { if(a[i]==b[i]) sumn++; } if(sumn!=per[m].lock) return 0; sumn=0; for(i=0;i<4;i++)//判断数字相同数 { for(j=0;j<4;j++) { if(a[i]==b[j]&&sign[j]==0)//Bug:只能比较一次 {sumn++;sign[j]=1;break;} } } if(sumn!=per[m].sum) return 0; return 1; } int main() { int i,j,n,flag,Sum,num; while(scanf("%d",&n),n!=0) { for(i=0;i<n;i++) scanf("%d%d%d",&per[i].number,&per[i].sum,&per[i].lock); flag=0;Sum=0; for(i=1000;i<=9999;i++) { for(j=0;j<n;j++) { flag=Check(i,j); if(!flag)break; } if(flag==1) {Sum++;num=i;} } if(Sum==1) printf("%d\n",num); else printf("Not sure\n"); memset(per,0,sizeof(per)); } return 0; }