题目描述:
有12枚硬币,其中只有一枚是假币,假币和真币的重量不同。现将这些硬币称了三次,告诉你称的结果,找出假币并确定假币是轻还是重。
输入:
- 第一行给出测试组数
- 每组数据有三行,每行表示一次称量的结果,硬币标号A~L,每次称量的结果用三个字符串分别表示 天平左端放置的硬币 右端放置的硬币 平衡状态(相对于右端)
- 左右两端的硬币总是相等的
输出:
输出哪一个是假币并说明比正币重还是轻
输入样例:
1
ABCD EFGH even
ABCI EFJK up
ABIJ EFGH even
输出样例:
K is the counterfeit coin and it is light.
小分析:
已知称量结果,我们可以用枚举的方法找到不合格的硬币,从A硬币到L硬币,依次判断它的轻重情况
#include <bits/stdc++.h>
using namespace std;
string a[3],b[3];
string s[3];
bool IsFake(char c,bool bl){
for(int i=0;i<3;i++){
string pa,pb;//pa表示左边的假币,pb表示右边的假币
if(bl){//轻
pa=a[i];
pb=b[i];
}
else{//重的话左右要颠倒一下
pa=b[i];
pb=a[i];
}
switch(s[i][0]){
case 'u':
if(pb.find(c)==-1)return false;//find()函数--c++STL标准库string(必须要会)
break;
case 'e':
if(pa.find(c)!=-1||pb.find(c)!=-1)return false;
break;
case 'd':
if(pa.find(c)==-1)return false;
break;
}
}
return true;
}
int main(){
int t;
cin>>t;
while(t--){
for(int i=0;i<3;++i)cin>>a[i]>>b[i]>>s[i];
for(char c='A';c<='L';c++){
if(IsFake(c,true)){ //假币是轻的
cout<<c<<" is the counterfeit coin and it is light."<<endl;
break;
}
else if(IsFake(c,false)){ //假币是重的
cout<<c<<" is the counterfeit coin and it is heavy."<<endl;
break;
}
// cout<<c<<endl;
}
}
return 0;
}