#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<fstream>
#include<algorithm>
#define MAXN 105
using namespace std;
typedef struct{
int num[10], a, b;
char str[10];
void Switch(){
for(int i = 0; i < 4; i ++)
num[i] = str[i]-'0';
}
}Gusse;
Gusse gg[MAXN];
int ans[10], target[10], flag, N;
bool Is_In_num(int i){
int num1[10], num2[10], cnt = 0;
memset(num1, 0, sizeof(num1));
memset(num2, 0, sizeof(num2));
for(int j = 0; j < 4; j ++) num1[ans[j]]++;
for(int j = 0; j < 4; j ++) num2[gg[i].num[j]]++;
for(int j = 0; j < 10;j ++) if(num1[j] && num2[j]) cnt += min(num1[j], num2[j]);
return cnt == gg[i].a;
}
bool Is_Ok_num(int i){
int cnt = 0;
for(int j = 0; j < 4; j ++)
if(ans[j] == gg[i].num[j]) cnt++;
return cnt == gg[i].b;
}
bool OK(){
for(int i = 0; i < N; i ++)
if(!Is_In_num(i) || !Is_Ok_num(i)) return false;
return true;
}
void dfs(int cnt){
if(cnt == 4){
if(OK()){
flag++;
for(int i = 0; i < 4; i ++) target[i] = ans[i];
}
return ;
}
for(int i = 0; i < 10; i ++){
if((cnt + i)){
ans[cnt] = i;
dfs(cnt+1);
}
}
}
int main(){
freopen("in.c", "r", stdin);
while(~scanf("%d", &N) && N){
for(int i = 0; i < N; i ++){
scanf("%s%d%d", gg[i].str, &gg[i].a, &gg[i].b);
gg[i].Switch();
}
flag = 0;
dfs(0);
if(flag != 1) printf("Not sure\n");
else{
for(int i = 0; i < 3; i ++) printf("%d", target[i]);
printf("%d\n", target[3]);
}
}
return 0;
}
HDOJ 1172
程序员文章站
2022-05-22 11:38:03
...