题目 有12枚硬币。其中有11枚真币和1枚假币。假币和真 币重量不同,但不知道假币比真币轻还是重。现在,用一架天平称了这些币三次,告诉你称的结果,请你找出假币并且确定假币是轻是重(数据保证一定能找出来)。 输入 第一行是测试数据组数。 每组数据有三行,每行表示一次称量的结果。银币标号为 A-L。每次称量的结果用三个以空格隔开的字符串表示: 天平左边放置的硬币 天平右边放置的硬币 平衡状态。其 中平衡状态用up’’,down’’, 或 ``even’'表示, 分别为右 端高、右端低和平衡。天平左右的硬币数总是相等的。
输出
输出哪一个标号的银币是假币,并说明它比真币轻还是重。
输入样例 1 ABCD EFGH even ABCI EFJK up ABIJ EFGH even 输出样例 K is the counterfeit coin and it is light.
#include <iostream> #include <cstring> using namespace std; char Left[3][7]; //天平左边硬币 char Right[3][7]; //天平右边硬币 char result[3][7]; //结果 bool IsFake(char c,bool light); int main() { int 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) //light 为真表示假设假币为轻,否则表示假设假币为重 { for(int i = 0;i < 3; ++i) { char * pLeft,*pRight; //指向天平两边的字符串 if(light) { //轻 pLeft = Left[i]; pRight = Right[i]; } else //重 {//如果假设假币是重的,则把称量结果左右对换 pLeft = Right[i]; //pl始终指向重的 pRight = Left[i]; //pr始终指向轻的 } switch(result[i][0]) { //天平右边的情况 case 'u': //左低又高 if ( strchr(pRight,c) == NULL) //轻?右:左 return false; //如轻,本应在右,右边==NULL,返回false break; case 'e': //平衡 if( strchr(pLeft,c) || strchr(pRight,c)) //假币不在两边 return false; //如在,为假 break; case 'd': // 轻?左:右 if ( strchr(pLeft,c) == NULL) //如轻,本应在左,没找到,false return false; break; } } return true; }