因为时间给的非常多,然后测试组数又很小,所以是一个很粗暴的模拟
只要从1000到9999枚举答案,然后再判断符合答案的个数,看个数的数量差不多就做完了
然后就在于如何判断有几个数字同时存在,我的思路是用vis1和vis2分别记录进行比较的两个数字中,每个数字出现的次数
那么如果对于某个数字,vis1[i]和vis2[i]都不等于0,就说明有min(vis1[i],vis2[i])个数字同时存在
还有把,,就是,,突然爱上宏定义了,,本来刚开始的时候写了一大堆的for,后来发现用For的写法,写起来真轻松!
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<functional>
#include<algorithm>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int MX = 1000 + 5;
const int INF = 0x3f3f3f3f;
#define For(i,x,y) for(int i=x;i<=y;i++)
#define mem(x,y) memset(x,y,sizeof(x))
/***************************************/
int A[MX], B[MX], C[MX];
int vis1[100], vis2[100];
void get(int x, int w[]) {
For(i, 0, 3) {
w[i] = x % 10;
x /= 10;
}
}
bool check(int x, int n) {
int a[4], s[4];
get(x, a);
For(i, 0, 3) vis1[a[i]]++;
For(id, 1, n) {
get(A[id], s);
For(i, 0, 3) vis2[s[i]]++;
int c1 = 0, c2 = 0;
For(i, 0, 9) {
if(vis1[i] && vis2[i]) {
c1 += min(vis1[i], vis2[i]);
}
}
For(i, 0, 3) c2 += (a[i] == s[i]);
For(i, 0, 3) vis2[s[i]] = 0;
if(B[id] != c1 || C[id] != c2) {
For(i, 0, 3) vis1[a[i]] = 0;
return false;
}
}
For(i, 0, 3) vis1[a[i]] = 0;
return true;
}
int main() {
int n;
while(~scanf("%d", &n), n) {
mem(vis1, 0);
mem(vis2, 0);
For(i, 1, n) {
scanf("%d%d%d", &A[i], &B[i], &C[i]);
}
int cnt = 0, ans;
For(i, 1000, 9999) {
if(check(i, n)) {
cnt++;
ans = i;
}
}
if(cnt == 1) {
printf("%d\n", ans);
} else {
printf("Not sure\n");
}
}
return 0;
}