枚举算法称硬币C语言,【算法系列之枚举】称硬币

题目

有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

2 #include

3 using namespacestd;4 char Left[3][7]; //天平左边硬币,3代表3次称量情况,7代表硬币数

5 char Right[3][7]; //天平右边硬币

6 char result[3][7]; //结果

7 bool IsFake(char c,boollight) ;8 //light 为真表示假设假币为轻,否则表示假设假币为重

9 intmain() {10 intt; //测试数据组数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,boollight)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 }

原文:http://www.cnblogs.com/vinpho/p/7197843.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值