大致题意:
有一打(12枚)硬币,其中有且仅有1枚假币,11枚真币
用A~L作为各个硬币的代号
假币可能比真币略轻,也可能略重
现在利用天枰,根据Input输入的3次称量,找出假币,并输出假币是轻还是重。
解题思路:暴力枚举:枚举每个硬币为轻的假币、重的假币,如果不满足3个称量结果,继续寻找,直到找到满足的。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
char Left[5][10],Right[5][10],balance[5][10];
bool is_right(char ch,char weight,int k)
{
if(balance[k][0]=='e')
{ //判断左边 和右边
if(strchr(Left[k],ch) == NULL&&strchr(Right[k],ch)== NULL)
return true;
else
return false;
}
else if(balance[k][0]=='u')
{
if(weight=='L')
{
if(strchr(Right[k],ch)==NULL)
return false;
else
return true;
}
else if(weight=='H')
{
if(strchr(Left[k],ch)==NULL)
return false;
else
return true;
}
}
else if(balance[k][0]=='d')
{
if(weight=='H')
{
if(strchr(Right[k],ch)==NULL)
return false;
else
return true;
}
else if(weight=='L')
{
if(strchr(Left[k],ch)==NULL)
return false;
else
return true;
}
}
}
int main()
{
int n;
cin>>n;
while(n--)
{
memset(Left,0,sizeof(Left));
memset(Right,0,sizeof(Right));
memset(balance,0,sizeof(balance));
for(int i=1;i<=3;i++)
cin>>Left[i]>>Right[i]>>balance[i];
for(int i=0;i<12;i++)
{
//假设轻
int flag=1;
for(int j=1;j<=3;j++)
{
if(!is_right(i+65,'L',j))
{
flag=0;
break;
}
}
if(flag)
{
printf("%c is the counterfeit coin and it is light.\n",i+65);
break;
}
//假设重
flag=1;
for(int j=1;j<=3;j++)
{
if(!is_right(i+65,'H',j))
{
flag=0;
break;
}
}
if(flag)
{
printf("%c is the counterfeit coin and it is heavy.\n",i+65);
break;
}
}
}
}