思路:暴力枚举
AC代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=100+2; int A[maxn],B[maxn],C[maxn]; bool check(int i,int j,int k,int l,int m){ int a[4]; int b[4]={i,j,k,l}; int tmp=A[m]; for(int p=3;p>=0;p--){ a[p]=tmp; tmp/=10; } int tol=0; for(int p=0;p<4;p++){ if(a[p]==b[p]){ tol++; } } if(tol!=C[m]) return false; //如果不是C[m]个在对应的位置上 int cnt=0; for(int p=0;p<4;p++){ for(int r=0;r<4;r++){ if(a[p]==b[r]){ b[r]=-1; //为什么设置为-1?因为避免重复判断 cnt++; break; } } } if(cnt==B[m])return true ; return false ; } int main(){ int N; while(scanf("%d",&N)==1 && N){ for(int i=0;i<N;i++) scanf("%d%d%d",&A[i],&B[i],&C[i]); int count1=0; //用于最后结果的输出判断,只有等于1的时候才有解,0、2、3、等等都没有解 int t[4]; for(int i=1;i<=9;i++){ for(int j=0;j<=9;j++){ for(int k=0;k<=9;k++){ for(int l=0;l<=9;l++){ int m; bool fg; for(m=0;m<N;m++){ fg=check(i,j,k,l,m); if(!fg)break; } if(m==N && fg){ t[0]=i,t[1]=j,t[2]=k,t[3]=l; count1++; } } } } } if(count1==1)printf("%d%d%d%d\n",t[0],t[1],t[2],t[3]); else printf("Not sure\n"); } return 0; }