POJ1013 假币问题 枚举 暴力
题干:一共十二枚银币,一枚假的,注意就一枚是假的,假币重量与真币不同。通过三次称重来判别真假硬币,并判断比真的轻还是重,测量结果,up,down,even分别表示右盘轻了,右盘重了,平衡。硬币用A~L表示;
解题思路:枚举假设硬币是轻的,看是否符合每一个测量结果,符合这枚硬币就是假硬币,轻;否则假设硬币是重的,看是否符合每一个测量结果,把所有的硬币测量一边,即可以找到结果
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char L[3][7];
char R[3][7];
char result[3][7];
bool isfake(char c,bool light)
{
for(int i=0;i<3;i++)
{
char *pleft,*pright;
if(light)
{
pleft=L[i];
pright=R[i];
}
else
{
pleft=R[i];
pright=L[i];
}
switch(result[i][0])
{
case'u':if(strchr(pright,c)==NULL) return false;
break;
case'e':if(strchr(pleft,c)|| strchr(pright,c)) return false;
break;
case'd': if(strchr(pleft,c)==NULL) return false;
break;
}
}
return true;
}
int main()
{
int t;
cin>>t;
while(t--)
{
for(int i=0;i<3;i++)
cin>>L[i]>>R[i]>>result[i];
for(char c='A';c<='L';c++)
{
if(isfake(c,true))
{
cout<<c<<" is the counterfeit coin and it is light.\n";
break;
}
else if(isfake(c,false))
{
cout<<c<<" is the counterfeit coin and it is heavy.\n";
break;
}
}
}
return 0;
}