算法系列之枚举称硬币

Posted vinpho

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法系列之枚举称硬币相关的知识,希望对你有一定的参考价值。

  • 题目

    有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 }                                

 

以上是关于算法系列之枚举称硬币的主要内容,如果未能解决你的问题,请参考以下文章

(枚举)称硬币

枚举——称硬币

POJ1013称硬币枚举

⭐算法入门⭐《二分枚举》简单08 —— LeetCode 441. 排列硬币

算法系列之枚举生理周期

程序设计与算法