简单的枚举
题目大意:
至多有12个硬币,编号A-L,里面有一枚假币。多组数据,每组给出三次称量结果(even,up,down),保证可以找到假币,要求你输出假币编号并指出假币是比真币轻还是比真币重。
起初对所有硬币标记0;如果是even,则两边所有的硬币都是真的(记10);否则就对不确定的硬币记录怀疑(++或者--);最后只要看哪个硬币的绝对值最大,也就是被怀疑的次数最多,即是假币。
#include <stdio.h>
#include <string.h>
char left[3][7];
char right[3][7];
char result[3][5];
bool isHeavy(char);
bool isLight(char);
int main()
{
freopen("in.txt","r",stdin);
int n;
char c;
scanf("%d",&n);
while(n--)
{
for(int i=0; i<3; i++)
{
scanf("%s%s%s",left[i],right[i],result[i]);
}
for(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;
}
bool isLight(char x)
{
for(int i=0; i<3; i++)
{
switch(result[i][0])
{
case 'u':
if(strchr(right[i],x)==NULL) return false;
break;
case 'e':
if(strchr(right[i],x)!=NULL||strchr(left[i],x)!=NULL) return false;
break;
case 'd':
if(strchr(left[i],x)==NULL) return false;
break;
}
}
return true;
}
bool isHeavy(char x)
{
for(int i=0; i<3; i++)
{
switch(result[i][0])
{
case 'u':
if(strchr(left[i],x)==NULL) return false;
break;
case 'e':
if(strchr(left[i],x)!=NULL||strchr(right[i],x)!=NULL) return false;
break;
case 'd':
if(strchr(right[i],x)==NULL) return false;
break;
}
}
return true;
}