这是一道可以暴力枚举的水题。
//以下两个都可以ac,其实差不多一样,呵呵
//1:
//4 wei shu #include<stdio.h> struct tt { char a[5],b[5],c[5]; }e[110]; int main() { int n,i,count,j,num[5],mark[5],yi,flag,a1,a2,a3,a4; while(scanf("%d",&n),n) { for(i=0;i<n;i++) { scanf("%s%s%s",e[i].a,e[i].b,e[i].c); } yi=0;flag=0; num[0]=1;num[1]=num[2]=num[3]=0; for(j=1000;j<10000;j++) { for(i=0;i<n;i++) { count=0; for(int ii=0;ii<4;ii++) if(num[ii]==e[i].a[ii]-'0') count++; if(count!=e[i].c[0]-'0')break; for(int q=0;q<5;q++)mark[q]=0; count=0; for(int ii=0;ii<4;ii++) { for(int jj=0;jj<4;jj++) { if(num[ii]==e[i].a[jj]-'0'&&mark[jj]==0) {mark[jj]=1,count++;break;} } } if(count!=e[i].b[0]-'0')break; } if(i==n) { flag++; if(yi==0)a1=num[0],a2=num[1],a3=num[2],a4=num[3],yi=1; } num[3]++; if(num[3]>9)//原来之前是这里细节出错了,要注意哦 num[2]++,num[3]=num[3]%10; if(num[2]>9) num[1]++,num[2]=num[2]%10; if(num[1]>9) num[0]++,num[1]=num[1]%10; num[0]=num[0]%10; } if(flag==1) printf("%d%d%d%d ",a1,a2,a3,a4); else printf("Not sure "); } return 0; }
//2:
#include<stdio.h> struct tt { char a[5],b[2],c[2]; }e[105]; int main() { int n,i,count,j,num[4],flag,a1,a2,a3,a4; bool yi,mark[4]; while(scanf("%d",&n),n) { for(i=0;i<n;i++)scanf("%s%s%s",e[i].a,e[i].b,e[i].c); yi=false; num[0]=num[1]=num[2]=num[3]=flag=0; for(j=1;j<10000;j++) { for(i=0;i<n;i++) { count=0; for(int ii=0;ii<4;ii++) if(num[ii]==e[i].a[ii]-'0')count++; if(count!=e[i].c[0]-'0')break; for(int q=0;q<4;q++)mark[q]=false; count=0; for(int w=0;w<4;w++) for(int r=0;r<4;r++) if(num[w]==e[i].a[r]-'0'&&!mark[r]) {mark[r]=true,count++;break;} if(count!=e[i].b[0]-'0')break; } if(i==n){ flag++; if(!yi)a1=num[0],a2=num[1],a3=num[2],a4=num[3],yi=true; } num[3]++; if(num[3]>9)num[2]++,num[3]=num[3]%10; //原来之前是这里细节出错了,要注意哦 if(num[2]>9)num[1]++,num[2]=num[2]%10; if(num[1]>9)num[0]++,num[1]=num[1]%10; num[0]=num[0]%10; } if(flag==1)printf("%d%d%d%d ",a1,a2,a3,a4); else printf("Not sure "); } return 0; }
//不过2很神奇的是0毫秒,原因不详