- 题目
有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.
- 解题思路
对于每一枚硬币先假设它是轻的,看这样是否符合 称量结果。如果符合,问题即解决。如果不符合,就 假设它是重的,看是否符合称量结果。把所有硬币都 试一遍,一定能找到特殊硬币
- 完整代码
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 char Left[3][7]; //天平左边硬币,3代表3次称量情况,7代表硬币数 5 char Right[3][7]; //天平右边硬币 6 char result[3][7]; //结果 7 bool IsFake(char c,bool light) ; 8 //light 为真表示假设假币为轻,否则表示假设假币为重 9 int main() { 10 int t; //测试数据组数 11 cin >> t; 12 while(t--) { 13 for(int i = 0;i < 3; ++i) cin >> Left[i] >> Right[i]>>result[i]; 14 for(char c=‘A‘; c<=‘L‘;c++) { 15 if( IsFake(c,true) ){ 16 cout << c << " is the counterfeit coin and it is light.\n"; 17 break; 18 } 19 else if( IsFake(c,false) ){ 20 cout << c << " is the counterfeit coin and it is heavy.\n"; 21 break; 22 } 23 } 24 } 25 return 0; 26 } 27 bool IsFake(char c,bool light) 28 //light 为真表示假设假币为轻,否则表示假设假币为重 29 { 30 for(int i = 0;i < 3; ++i) { 31 char * pLeft,*pRight; //指向天平两边的字符串 32 if(light) { 33 pLeft = Left[i]; 34 pRight = Right[i]; 35 } 36 else { 37 pLeft = Right[i]; 38 pRight = Left[i]; 39 } 40 switch(result[i][0]) { 41 case ‘u‘: 42 if ( strchr(pRight,c) == NULL) 43 return false; 44 break; 45 case ‘e‘: 46 if( strchr(pLeft,c) || strchr(pRight,c)) 47 return false; 48 break; 49 case ‘d‘: 50 if ( strchr(pLeft,c) == NULL) 51 return false; 52 break; 53 } 54 } 55 return true; 56 }
时间: 2024-10-13 10:29:57