题目大意:一共有12个硬币,其中有且只有一个假币,假币可能轻一些也可能重一些。输入给定三组天平的称重结果,有三种状态:up(左边重)、even(一样重)、down(右边重)。三组状态能保证唯一确定假币,求假币是哪一个并且假币是轻还是重。
题目链接:http://poj.org/problem?id=1013
将题目转化为判定问题,依次假设12个硬币为假币,判断是否符合三次天平判定结果,知道找到正确的假币为止。
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <string>
using namespace std;
char l[3][7];
char r[3][7];
int p[3];
char tmp[7];
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
for(int i=0;i<3;i++)
{
scanf("%s%s%s",l[i],r[i],tmp);
if(!strcmp(tmp,"up"))
p[i]=1;
else if(!strcmp(tmp,"even"))
p[i]=0;
else p[i]=-1;
}
int i;
bool flag;
bool heavy;
for(i='A';i<='L';i++)
{
flag=true;
for(int j=0;j<3;j++)
{
int status=0;
for(int k=0;l[j][k]!='\0';k++)
{
if(l[j][k]==i)
{
status=1;
break;
}
if(r[j][k]==i)
{
status=-1;
break;
}
}
if(status!=p[j])
{
flag=false;
break;
}
}
if(flag)
{
heavy=true;
break;
}
flag=true;
for(int j=0;j<3;j++)
{
int status=0;
for(int k=0;l[j][k]!='\0';k++)
{
if(l[j][k]==i)
{
status=-1;
break;
}
if(r[j][k]==i)
{
status=1;
break;
}
}
if(status!=p[j])
{
flag=false;
break;
}
}
if(flag)
{
heavy=false;
break;
}
}
printf("%c is the counterfeit coin and it is %s.\n",i,(heavy?"heavy":"light"));
}
return 0;
}