题干:

猜数字游戏是gameboy最喜欢的游戏之一。游戏的规则是这样的:计算机随机产生一个四位数,然后玩家猜这个四位数是什么。每猜一个数,计算机都会告诉玩家猜对几个数字,其中有几个数字在正确的位置上。 
比如计算机随机产生的数字为1122。如果玩家猜1234,因为1,2这两个数字同时存在于这两个数中,而且1在这两个数中的位置是相同的,所以计算机会告诉玩家猜对了2个数字,其中一个在正确的位置。如果玩家猜1111,那么计算机会告诉他猜对2个数字,有2个在正确的位置。 
现在给你一段gameboy与计算机的对话过程,你的任务是根据这段对话确定这个四位数是什么。 

Input

输入数据有多组。每组的第一行为一个正整数N(1<=N<=100),表示在这段对话中共有N次问答。在接下来的N行中,每行三个整数A,B,C。gameboy猜这个四位数为A,然后计算机回答猜对了B个数字,其中C个在正确的位置上。当N=0时,输入数据结束。 

Output

每组输入数据对应一行输出。如果根据这段对话能确定这个四位数,则输出这个四位数,若不能,则输出"Not sure"。 

Sample Input

6
4815 2 1
5716 1 0
7842 1 0
4901 0 0
8585 3 3
8555 3 2
2
4815 0 0
2999 3 3
0

Sample Output

3585
Not sure

 

解题报告:

     因为这题元素不多,1000-9999,所以枚举一下就可以了。然后看跑完一遍以后如果有多个满足条件的那就notsure,如果只有一个满足条件的那就输出这一个。然后还要注意fit函数中必须用book数组记录当前位置是否判断过(在判断猜对数字时需要用,在判断猜对位置时不需要用),否则 1234 和5116,这种在循环的时候也会被判断成有两个猜对数字,但其实只有一个猜对数字。

AC代码:

#include<cstring>
#include<set>
#include<iostream>
#include<algorithm>
#include<cstdio>
#define ll long long
using namespace std;
int n;
int guess[5000],yes[5000],yespos[5000];
set<int >:: iterator it;
//比较set中值和guess中i ,看set中的是否满足这个gusee如果不满足那就删除这个可能值。
bool fit(int inset,int ii) {
// int ge[2],shi[2],bai[2],qian[2];
int tmp = guess[ii];
int geussi[5] ;
int inseti[5] ;
int p = 0;
while(inset) {
inseti[++p] = inset%10;
inset/=10;
}
p = 0;
while(tmp) {
geussi[++p] = tmp%10;
tmp/=10;
}
int ans = 0;
bool bk1[5],bk2[5];
memset(bk1,0,sizeof(bk1));
memset(bk2,0,sizeof(bk2));
for(int i = 1; i<=4; i++) {
for(int j = 1; j<=4; j++) {
if(geussi[i] == inseti[j] && !bk1[i] && !bk2[j]) {
ans++;bk1[i]=1;bk2[j] = 1;
}
}
}
if(ans != yes[ii]) return 0 ;
ans = 0;
for(int i = 1; i<=4; i++) {
if(geussi[i] == inseti[i]) ans++;
}
if(ans != yespos[ii]) return 0 ;
return 1;
// ge[0] = inset%10;ge[1] = geussi%10;
// inset/=10;geussi/=10;
// shi[0] = inset%10;shi[1] = geussi%10;
// inset/=10;geussi/=10;
// bai[0]=inset%10;bai[1] = geussi%10;
// inset/=10;geussi/=10;
// qian[0]=inset%10;qian[1] = geussi%10;
//

}
int main()
{
while(scanf("%d",&n)) {
if(n == 0 ) break;
set<int > st;
// for(int i = 1000; i<=9999; i++) st.insert(i);
for(int i = 1; i<=n; i++) {
scanf("%d%d%d",&guess[i],&yes[i],&yespos[i]);
}
int ans = 0,res,flag;
// while(!st.empty()) {
// for(it = st.begin(); it!=st.end(); it++) {
for(int q = 1000; q<=9999; q++) {
flag = 0;
for(int i = 1; i<=n; i++) {
if(!fit(q,i)) {
flag = 1; break;
}
}
if(flag == 0) {
res = q;
ans++;
}
if(ans >=2) break;
}
if(ans>=2) cout << "Not sure"<<endl;
else cout << res<< endl;
// }
// }
// if(st.empty() || st.size() !=1) puts("Not sure");
// else printf("%d\n",*(st.begin()));

}


return 0 ;
}

总结:

   本来想用set, 然后枚举过一个就删除一个顶点,但是发现没必要啊反正整个循环你就跑一次(即1000~9999)这些数字就跑一次,用set有卵用。。。。