描述
数字猜想是一个电脑游戏。首先,电脑会选择四个不重复的数字,你要根据电脑的提示尽快地猜出这个数字。电脑给的提示形式是“#A#B”,其中“#”是0~4的数字。其中“#A”表示猜中了数字.和位置的数目,“#B”表示猜中数字的数目。比如,电脑选择的是1234,你猜的是6139,电脑给的提示是“1A2B”,因为数字“3”既猜中了数字,也猜对了位置,而数字“1”只猜中了数字,所以电脑给的提示就是“1A2B”。
现在,你仔细记录了你每次猜的数字和电脑的提示,你感觉应该可以猜对结果了。是的,生活中充满了智慧,不是吗?
输入
有多个测试序列。每个测试序列的第一行是一个单独的正整数N,表示猜想的次数,接下来的N行是N次猜想的记录,形式为:
#### #A#B
前面四个数字是猜想的数字,后面是电脑对猜想的提示。
输入N为0或者负整数表示输入结束,并且无须处理。
输出
对于每个测试序列,输出一行,给出电脑选定的数字,要求数字和位置都正确。你可以假设,每个测试序列都提供了足够的信息,让你可以猜出该数字。
样例输入
样例输出
#include<iostream> #include<cstring> using namespace std; struct node { char str[5]; int a,b; }; node we[1000]; int main() { int a,b,c,d,n,i,j,t[100]; char ab[5],tem[5]; while(cin>>n) { if(n==-1)break; for(i=0;i<n;i++) { cin>>we[i].str>>tem; we[i].a=tem[0]-48; we[i].b=tem[2]-48; } for(a=0;a<10;a++) for(b=0;b<10;b++) for(c=0;c<10;c++) for(d=0;d<10;d++) { //cout<<"frawef"<<endl; //if(f==0)break; if(a!=b&&a!=c&&a!=d&&b!=c&&b!=d&&c!=d) { ab[0]=char(a+48); ab[1]=char(b+48); ab[2]=char(c+48); ab[3]=char(d+48); ab[4]=‘\0‘; //cout<<c<<endl; memset(t,0,sizeof(t)); t[a]=t[b]=t[c]=t[d]=1; for(i=0;i<n;i++) { int s=0,x=0; for(j=0;j<4;j++) { if(t[we[i].str[j]-48])s++; if((we[i].str[j])==ab[j]){x++; } } if(s!=we[i].b||x!=we[i].a)break; } if(i==n) { cout<<ab<<endl; // f=0; } } } } return 0; }
数字猜想-Hunan University 2008 the 4th Programming Contest,布布扣,bubuko.com
数字猜想-Hunan University 2008 the 4th Programming Contest
原文:http://blog.csdn.net/zhangweiacm/article/details/21242455