题意:
猜数字游戏是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; }