#include<iostream>usingnamespace std;enum{LIGHT,HEAVY};boolisFake(char coin,bool state);//假设假的硬币的字母是coin,state表示是假设是轻的还是重的 boolisInvolved(char ch,char* str);//检查字符是否包含在字符串中,可以用strchr代替char left_coin[3][5],right_coin[3][5],result[3][5];//全局数组,方便沟通intmain(int argc,charconst*argv[]){int t;cin>>t;while(t--)//多组数据的处理{for(int i=0;i<3;++i)
cin>>left_coin[i]>>right_coin[i]>>result[i];//读入测试数据,用空格分隔的数据用cin或者scanf读入 for(char ch='A';ch<='L';++ch)//从A到L遍历{if(isFake(ch,LIGHT)){
cout<<ch<<" is the counterfeit coin and it is light."<<endl;break;}if(isFake(ch,HEAVY)){
cout<<ch<<" is the counterfeit coin and it is heavy."<<endl;break;}}}return0;}boolisFake(char coin,bool state)//题设中的结果是写的右边的,state用来切换假设是轻还是重//轻重的假设是通过切换pLeft和pRight的指向做到的//默认假设是轻的{char*pLeft,*pRight;for(int i=0;i<3;i++){if(state==LIGHT){
pLeft=left_coin[i];
pRight=right_coin[i];}else{
pLeft=right_coin[i];
pRight=left_coin[i];}switch(result[i][0])//通过结果的首字母来确定是哪个结果{case'e'://两边平衡时
if(isInvolved(coin,pLeft)||isInvolved(coin,pRight))//如果结果是平衡,有异常的硬币不应该在两边returnfalse;break;case'u'://右边up,即结果反映轻的在右边
if(!isInvolved(coin,pRight))//默认硬币是轻的,就应该在右边returnfalse;break;case'd'://右边down<=>左边up
if(!isInvolved(coin,pLeft))returnfalse;break;}}returntrue;//只有在三组数据都没报错,才会返回正确,中间只要有一组错就错了}boolisInvolved(char ch,char*str){while(*str!='\0'){if(*str==ch)returntrue;
str++;}returnfalse;}