数字猜想-Hunan University 2008 the 4th Programming Contest
原创
©著作权归作者所有:来自51CTO博客作者wx63864a6559994的原创作品,请联系作者获取转载授权,否则将追究法律责任
描述
数字猜想是一个电脑游戏。首先,电脑会选择四个不重复的数字,你要根据电脑的提示尽快地猜出这个数字。电脑给的提示形式是“#A#B”,其中“#”是0~4的数字。其中“#A”表示猜中了数字.和位置的数目,“#B”表示猜中数字的数目。比如,电脑选择的是1234,你猜的是6139,电脑给的提示是“1A2B”,因为数字“3”既猜中了数字,也猜对了位置,而数字“1”只猜中了数字,所以电脑给的提示就是“1A2B”。
现在,你仔细记录了你每次猜的数字和电脑的提示,你感觉应该可以猜对结果了。是的,生活中充满了智慧,不是吗?
输入
有多个测试序列。每个测试序列的第一行是一个单独的正整数N,表示猜想的次数,接下来的N行是N次猜想的记录,形式为:
#### #A#B
前面四个数字是猜想的数字,后面是电脑对猜想的提示。
输入N为0或者负整数表示输入结束,并且无须处理。
输出
对于每个测试序列,输出一行,给出电脑选定的数字,要求数字和位置都正确。你可以假设,每个测试序列都提供了足够的信息,让你可以猜出该数字。
样例输入
2
1234 2A4B
1243 0A4B
3
0732 3A3B
1526 0A0B
4567 0A2B
-1
样例输出
2134
0734
#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;
}