题干:

猜数字游戏是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有卵用。。。。