有12个硬币, 其中有一个是假的,我们不知道假的硬币是比正常的硬币轻或重,现在用一个只可以比较两端重量的等臂天平,秤 3 次,把假的硬币找出来。(没有砝码或其它的辅助工具)
郭炜老师的代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char Left[3][7];//天平左边硬币
char Right[3][7];// 天平右边硬币
char Result[3][7];//结果
bool IsFake(char c, bool light);//light为真表示假设假币为轻,否则假币为重
int main(){
int t;//t为测试数据组数
cin>>t;
while(t--){
for(int i=0;i<3;++i)
cin>> Left[i] >> Right[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;
}
bool IsFake(char c, bool light){
for(int i=0; i<3; ++i){
char *pLeft,*pRight;
if(light){
pLeft=Left[i];
pRight=Right[i];
}
else{//如果假设假币是重的,则把称量结果左右对换
pLeft=Right[i];
pRight=Left[i];
}
switch(Result[i][0]){//天平右边的情况
case 'u':
if(strchr(pRight,c)==NULL)
return false;
break;
case 'e':
if(strchr(pRight,c)==NULL||strchr(pLeft,c)==NULL)
return false;
break;
case 'd':
if(strchr(pLeft,c)==NULL)
return false;
break;
}
}
return true;
}