思路一:
先初始化b数组1000~9999;
然后每输入一个条件就更新b数组;
最后看b数组中的个数,为1 yes;or no;
@@@@数组更新较难处理
思路二:
保存所有条件;
看1000~9999中每个数能过全部的条件
保存符合条件的个数;
较优:
for(int k=0;k<4;k++) { int t=a[k]-'1'+1;//化为整数 if(j1==t) { Bi++; if(k==0)Ci++; } else if(j2==t) { Bi++; if(k==1)Ci++; } else if(j3==t) { Bi++; if(k==2)Ci++; } else if(j4==t) { Bi++; if(k==3)Ci++; } } 出错数据 : 4234 3124 对比
思路一:
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; int main() { int N,size,sizei; char a[5]; int t[5]; int jt[5];//保存数的各位 int b[9005]; int A,B,C; int Bi,Ci; int i,j,ii,jj; while(scanf("%d",&N)!=EOF&&N!=0) { memset(a,0,sizeof(a)); memset(t,0,sizeof(t)); memset(jt,0,sizeof(jt)); for(i=1000,j=0; i<10000; j++,i++) b[j]=i;//数组初始化 sizei=9000;//数组大小 for(i=0; i<N; i++) { scanf("%s %d %d",a,&B,&C); size=0;//每输入一次,b数组就更新 for(int ji=0; ji<sizei; ji++) //枚举b数组中的数 { j=b[ji]; for(int k=0; k<4; k++) t[k]=a[k]-'1'+1;//化为整数 jt[0]=j/1000; jt[1]=(j%1000)/100; jt[2]=(j%100)/10; jt[3]=j%10; Bi=0;//对了多少个数字 Ci=0;//对的位置 //printf("%c %c\n",j1,j2); for(int k=0; k<4; k++) if(jt[k]==t[k])jt[k]=-1,t[k]=-2,Ci++,Bi++; for(int k=0; k<4; k++) { //后判断对的数字数,不能重复相等 eg:2111 1345 if(jt[0]==t[k]){Bi++;jt[0]=-1;t[k]=-2;} else if(jt[1]==t[k]){Bi++;jt[1]=-1;t[k]=-2;}//忘了 else if(jt[2]==t[k]){Bi++;jt[2]=-1;t[k]=-2;}//忽略了 else if(jt[3]==t[k]){Bi++;jt[3]=-1;t[k]=-2;}//Wa伤了 } //printf("#%d %d\n",Bi,Ci); if(Bi==B&&Ci==C)b[size++]=j; //printf("#%d\n",size); } sizei=size; //for(j=0;j<size;j++) //printf("%d ",b[j]); //printf("$%d\n",size); } if(sizei!=1)printf("Not sure\n"); else printf("%d\n",b[0]); } return 0; }