题目:大意就是猜数,给定个四位数,然后给出这个数与正确的数之间的比较(#A*B,#代表有#个数字他的值和位置都对了,*代表有*个数的值对了),给出n个上述的4位数,让你确定这个正确的数是多少。
思路:直接暴力。
注意:程序结束是n为负数,而不是-1,为此超时了两次 T T。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct node
{
char s[5];
int a,b;
}t[5600];
int n;
bool solve(char a,char b,char c,char d)
{
int l=0,r=0;
for(int i=0;i<n;i++)
{
l=0,r=0;
if(t[i].s[0]==a) l++,r++;
else if(t[i].s[0]==b||t[i].s[0]==c||t[i].s[0]==d) r++;
if(t[i].a<l||t[i].b<r) return false;
if(t[i].s[1]==b) l++,r++;
else if(t[i].s[1]==a||t[i].s[1]==c||t[i].s[1]==d) r++;
if(t[i].a<l||t[i].b<r) return false;
if(t[i].s[2]==c) l++,r++;
else if(t[i].s[2]==b||t[i].s[2]==a||t[i].s[2]==d) r++;
if(t[i].a<l||t[i].b<r) return false;
if(t[i].s[3]==d) l++,r++;
else if(t[i].s[3]==b||t[i].s[3]==c||t[i].s[3]==a) r++;
if(t[i].a!=l||t[i].b!=r) return false;
}
return true;
}
int main()
{
int i,j,k,l;
while(scanf("%d",&n))
{
if(n<0) break;
for(i=0;i<n;i++)
{
scanf("%s %dA%dB",t[i].s,&t[i].a,&t[i].b);
}
for(i='0';i<='9';i++)
for(j='0';j<='9';j++)
{
if(i==j) continue;
for(k='0';k<='9';k++)
{
if(k==i||k==j) continue;
for(l='0';l<='9';l++)
{
if(l==k||l==j||l==i) continue;
if(solve(i,j,k,l))
{
printf("%c%c%c%c\n",i,j,k,l);
goto En;
}
}
}
}
En:continue;
}
return 0;
}