猜数字
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7279 Accepted Submission(s): 4002
Problem Description
猜数字游戏是gameboy最喜欢的游戏之一。游戏的规则是这样的:计算机随机产生一个四位数,然后玩家猜这个四位数是什么。每猜一个数,计算机都会告诉玩家猜对几个数字,其中有几个数字在正确的位置上。
比如计算机随机产生的数字为1122。如果玩家猜1234,因为1,2这两个数字同时存在于这两个数中,而且1在这两个数中的位置是相同的,所以计算机会告诉玩家猜对了2个数字,其中一个在正确的位置。如果玩家猜1111,那么计算机会告诉他猜对2个数字,有2个在正确的位置。
现在给你一段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
#include<iostream> using namespace std; const int N=101; int n; struct M{ int a,b,c;//a,b,c分别是输入的A,B,C }m[N]; int test(int x,int y){ int b[4],c[4],j,i,k=0,s=0,f[4]={0,0,0,0}; c[0]=x%10;//模拟值 c[1]=(x/10)%10; c[2]=(x/100)%10; c[3]=x/1000; b[0]=m[y].a%10;/////输入值 b[1]=(m[y].a/10)%10; b[2]=(m[y].a/100)%10; b[3]=m[y].a/1000; for(i=0;i<4;i++){//如果模拟值是结果,那么模拟值和输入值相等的位置就是输入正确的位置 if(b[i]==c[i]) k++; } if(k!=m[y].c)//如果正确位置的个数C和模拟值和输入值相等位数不一样,那么模拟值不是正确结果 return 1; for(i=0;i<4;i++)//对B进行判断,如果正确个数也相同就是正确结果对于每个输入值的每位只匹配一次 for(j=0;j<4;j++){ if(b[i]==c[j]&&f[j]==0) { s++; f[j]=1; break; } } if(s==m[y].b) return 0; else return 1; } int main(){ int i,j,k,sign,result; while(cin>>n&&n){ k=0; for(i=0;i<n;i++) cin>>m[i].a>>m[i].b>>m[i].c; for(i=1000;i<=9999;i++){//因为是4位数 sign=1;//赋初值为1,表示初始值是不存在正确结果 for(j=0;j<n;j++){ sign=test(i,j);//模拟值只要不符合一个输入值就不是正确结果,跳出 if(sign) break; } if(!sign){//如果直到测试完所有输入值模拟值都符合要求,那么它是正确值 k++; result=i; } } if(k==1)//如果跑完1000到9999,只有一个值符合要求,这就是正确值。 cout<<result<<endl; else cout<<"Not sure"<<endl; } return 0; }