HDU 1172 猜数字

题意:


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

思想:暴力枚举从1000枚举到9999,如果,N个条件都满足,就计数一次,如果计数超过两次就表示NOT SURE不确定。

题中的相同的数字,去相同最少,例如1112和1134,表示有两个1是同数字,而不是一个1或者三个1。

#include<stdio.h>
#include<string.h>
int N;
struct NODE{
	int num;
	int same_num;
	int right_pos;
}node[105];
int Min(int x,int y){
	if(x < y) return x;
	return y;
}
int CHK(int num1,int index){
	//if(num1 == 3585) printf("dsff\n");
	int num2 = node[index].num;
	int s_num = 0,r_pos = 0;
	
	int n4 = num1 % 10;
	num1 /= 10;
	int n3 = num1 % 10;
	num1 /= 10;
	int n2 = num1 % 10;
	num1 /= 10;
	int n1 = num1 % 10;
	
	int m4 = num2 % 10;
	num2 /= 10;
	int m3 = num2 % 10;
	num2 /= 10;
	int m2 = num2 % 10;
	num2 /= 10;
	int m1 = num2 % 10;
	
	if(n1 == m1) ++r_pos;
	if(n2 == m2) ++r_pos;
	if(n3 == m3) ++r_pos;
	if(n4 == m4) ++r_pos;
	
	int mark1[11],mark2[11];
	memset(mark1,0,sizeof(mark1));
	memset(mark2,0,sizeof(mark2));
	mark1[n1]++;
	mark1[n2]++;
	mark1[n3]++;
	mark1[n4]++;
	
	mark2[m1]++;
	mark2[m2]++;
	mark2[m3]++;
	mark2[m4]++;
	
	for(int i = 0;i <= 9; ++i){
		if(mark1[i] && mark2[i]){
			s_num += Min(mark1[i],mark2[i]);
		}
	}
	
	//if(num1 == 3585){
		//printf("<%d %d %d %d><%d %d %d %d>\n",n1,n2,n3,n4,m1,m2,m3,m4);
		//printf("同数字%d 同位置%d\n",s_num,r_pos);
	//}
	
	if(s_num == node[index].same_num && r_pos == node[index].right_pos){
		return 1;
	}
	else{
		return 0;
	}
}
int main()
{
	while(~scanf("%d",&N) && N){
		for(int i = 1;i <= N; ++i){
			scanf("%d%d%d",&node[i].num,&node[i].same_num,&node[i].right_pos);
		} 
		int cnt = 0,ans;
		for(int i = 1000;i <= 9999; ++i){
			int mark = true;
			//if(i == 3585) printf("dsff\n");
			for(int j = 1;j <= N; ++j){
				int res = CHK(i,j);
				//puts("jjjjj");
				if(!res){
					mark = false;
					break;
				}
			}
			if(mark){
				++cnt;
				ans = i;
			}
			if(cnt >= 2) break;
		}
		if(cnt == 1) printf("%d\n",ans);
		else printf("Not sure\n");
	} 
	return 0;
}


猜你喜欢

转载自blog.csdn.net/triple_wdf/article/details/80157787