注解
1、暴力枚举四位数,从1000到9999,看符合要求的数字的个数,如果正好有一个,就是答案,否则就是Not sure。
2、数字按位拆分,求出对应位置上的数字相同个数,以及总的数字相同个数(设置一个标志数组,标记有哪几个位置上的数字相同,防止出现猜测的数字为2222,当前数字为1122这样的极端情况,这种情况下,猜对的数字个数只能算2个,不能算4个)
3、不要用字符串和数字的相互转换,效率很慢。建议全部用整型。
代码
#include <iostream>
#include <cstring>
using namespace std;
const int MAXLEN = 4;
struct Number {
int A;
int B, C;
};
int judgeC(int a, int b) {
int num = 0;
while(a) {
int tmpA = a%10;
int tmpB = b%10;
if(tmpA==tmpB) {
num++;
}
a /= 10;
b /= 10;
}
return num;
}
int judgeB(int a, int b) {
int aa[MAXLEN];
int bb[MAXLEN];
aa[0] = a/1000;
aa[1] = (a/100)%10;
aa[2] = (a/10)%10;
aa[3] = a%10;
bb[0] = b/1000;
bb[1] = (b/100)%10;
bb[2] = (b/10)%10;
bb[3] = b%10;
int num = 0;
int tmp[MAXLEN];
memset(tmp, 0, sizeof(tmp));
for(int k=0; k<MAXLEN; k++) {
for(int kk=0; kk<MAXLEN; kk++) {
if(bb[k]==aa[kk] && !tmp[kk]) {
num++;
tmp[kk] = 1;
break;
}
}
}
return num;
}
int main() {
int N;
scanf("%d", &N);
while(N) {
Number num[N];
for(int i=0; i<N; i++) {
scanf("%d %d %d", &num[i].A, &num[i].B, &num[i].C);
}
int ansNum = 0;
int ans;
for(int i=1000; i<10000; i++) {
int corrDig = 0;
for(int j=0; j<N; j++) {
int countC = judgeC(i, num[j].A);
int countB = judgeB(i, num[j].A);
if(countC==num[j].C && countB==num[j].B) {
corrDig++;
}
}
if(corrDig==N) {
ansNum++;
ans = i;
}
}
if(ansNum==1) {
printf("%d\n", ans);
} else {
printf("Not sure\n");
}
scanf("%d", &N);
}
return 0;
}