http://poj.org/problem?id=1013
题目要求找出轻的或重的硬币
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
#define MAX 1000000
int ans[13];
char rright[12],lleft[12],re[5];
void findx(char str1[],char str2[],int l)
{
for(int i=0; i<12; i++)
{
bool flag=0;
for(int j=0; j<l; j++)
{
if((i+'A')==str1[j])
{
flag=1;
break;
}
}
for(int j=0; j<l; j++)
{
if(i+'A'==str2[j])
{
flag=1;
break;
}
}
if(!flag)
ans[i]=0;
}
}
int main()
{
int _;
scanf("%d",&_);
while(_--)
{
int flag=0;
memset(ans,-1,sizeof(ans));
for(int i=0; i<3; i++)
{
scanf("%s %s %s",lleft,rright,re);
int l=strlen(lleft);
int r=strlen(rright);
if(re[0]=='e') //如果相等 则出现的硬币都赋值为0
{
for(int j=0; j<l; j++)
ans[lleft[j]-'A']=0;
for(int j=0; j<r; j++)
ans[rright[j]-'A']=0;
}
else if(re[0]=='u') //如果是up 则左边出现的如果之前是1或者是0,则赋值为0,否则赋值为2 右边相反
{
for(int j=0; j<l; j++)
{
if(ans[lleft[j]-'A']==0||ans[lleft[j]-'A']==1)
ans[lleft[j]-'A']=0;
else
ans[lleft[j]-'A']=2;
}
for(int j=0; j<r; j++)
{
if(ans[rright[j]-'A']==0||ans[rright[j]-'A']==2)
ans[rright[j]-'A']=0;
else
ans[rright[j]-'A']=1;
}
findx(lleft,rright,l); //没有出现的赋值为0
}
else //为down 则相反
{
for(int j=0; j<l; j++)
{
if((ans[lleft[j]-'A']==0)||(ans[lleft[j]-'A']==2))
ans[lleft[j]-'A']=0;
else
ans[lleft[j]-'A']=1;
}
for(int j=0; j<r; j++)
{
if(ans[rright[j]-'A']==0||ans[rright[j]-'A']==1)
ans[rright[j]-'A']=0;
else
ans[rright[j]-'A']=2;
}
findx(lleft,rright,l);
}
}
for(int i=0; i<=11; i++)
{
if(ans[i]==2)
{
printf("%c is the counterfeit coin and it is heavy.\n",i+'A');
break;
}
if(ans[i]==1)
{
printf("%c is the counterfeit coin and it is light.\n",i+'A');
}
}
}
}