一开始的思想就是能够根据天平的平衡情况标记出所有的真币,然后天平不平衡情况的硬币中肯定只有一枚假币,剩下的都是已经判断为真的真币,很明显这种想法在下面这组测试用例中不成立:
ABCD EFGH even
IJ KA down
JK AB down
采用上面的思想无法判断出这组用例的结果。
因此正确的思想是遍历所有可能的方案(24种),(x,w)表示假币编号为x,w表示假币比真币轻还是重。
#include<stdio.h>
#include<string.h>
char s1[3][10],s2[3][10],res[3][5];
bool islight(char ch)
{
for(int i=0;i<3;i++)
{
switch(res[i][0])
{
case 'e':
if(strchr(s1[i],ch)!=NULL || strchr(s2[i],ch)!=NULL)
return false;
break; //switch 一定要记得break
case 'u':
if(strchr(s2[i],ch)==NULL) //相应硬币应该出现
return false;
break;
case 'd':
if(strchr(s1[i],ch)==NULL) //相应硬币应该出现
return false;
break;
}
}
return true;
}
bool isheavy(char ch)
{
for(int i=0;i<3;i++)
{
switch(res[i][0])
{
case 'e':
if(strchr(s1[i],ch)!=NULL || strchr(s2[i],ch)!=NULL)
return false;
break;
case 'u':
if(strchr(s1[i],ch)==NULL)
return false;
break;
case 'd':
if(strchr(s2[i],ch)==NULL)
return false;
break;
}
}
return true;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
for(int i=0;i<3;i++)
{
scanf("%s%s%s",s1[i],s2[i],res[i]);
}
for(char c='A';c<='L';c++) //遍历每个硬币
{
if(islight(c))
{
printf("%c is the counterfeit coin and it is light.\n",c);
break;
}
if(isheavy(c))
{
printf("%c is the counterfeit coin and it is heavy.\n",c);
break;
}
}
}
return 0;
}