假币问题(枚举)

来源:互联网 发布:数据库动态网页生成器 编辑:程序博客网 时间:2024/05/21 22:35

2692:假币问题

描述
赛利有12枚银币。其中有11枚真币和1枚假币。假币看起来和真币没有区别,但是重量不同。但赛利不知道假币比真币轻还是重。于是他向朋友借了一架天平。朋友希望赛利称三次就能找出假币并且确定假币是轻是重。例如:如果赛利用天平称两枚硬币,发现天平平衡,说明两枚都是真的。如果赛利用一枚真币与另一枚银币比较,发现它比真币轻或重,说明它是假币。经过精心安排每次的称量,赛利保证在称三次后确定假币。
输入
第一行有一个数字n,表示有n组测试用例。
对于每组测试用例:
输入有三行,每行表示一次称量的结果。赛利事先将银币标号为A-L。每次称量的结果用三个以空格隔开的字符串表示:天平左边放置的硬币 天平右边放置的硬币 平衡状态。其中平衡状态用``up'', ``down'', 或 ``even''表示, 分别为右端高、右端低和平衡。天平左右的硬币数总是相等的。
输出
输出哪一个标号的银币是假币,并说明它比真币轻还是重(heavy or light)。
样例输入
1ABCD EFGH even ABCI EFJK up ABIJ EFGH even 
样例输出
K is the counterfeit coin and it is light. 
来源
East Central North America 1998
计算概论05

strchr函数:
参考网址:http://blog.csdn.net/tommy_wxie/article/details/7554263
函数原型:extern char *strchr(char *str,char character)

参数说明:str为一个字符串的指针,character为一个待查找字符。
        
       所在库名:#include <string.h>
  
       函数功能:从字符串str中寻找字符character第一次出现的位置。
  
       返回说明:返回指向第一次出现字符character位置的指针,如果没找到则返回NULL。

其它说明:还有一种格式char *strchr( const char *string, int c ),这里字符串是以int型给出的。


解题思路:
对每一枚硬币进行枚举,假设它为假币。先假设它为轻,看是否满足条件,满足条件,问题解决;如果不满足,假设它为重,看是否满足条件。

#include<iostream>#include<cstring>using namespace std;char Left[3][7];//3次称量,天平左边硬币char Right[3][7];//天平右边硬币char result[3][7];//称量结果bool isfake(char c,bool light);//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."<<endl;break;}if(isfake(c,false)){cout<<c<<" is the counterfeit coin and it is heavy."<<endl;break;}}}return 0;} bool isfake(char c,bool light) //c表示假设的硬币c为假币,light为真,表示假币为轻,否则为重{for(int i=0;i<3;i++)//3次称量结果 {char *pleft,*pright;//指向天平两端的字符串if(light){pleft=Left[i];//left[i]第i次称量左边的字符集合 pright=Right[i];} else {pleft=Right[i];pright=Left[i];}switch(result[i][0]) //第i次的称量结果右边的情况,先假设假币c为轻,再假设假币为重(以下分析假设假币为轻,假币为重反之亦然) {case 'u':if(strchr(pright,c)==NULL)//c没在右边return false;break;case 'e':if(strchr(pright,c)||strchr(pleft,c)) //假币在左边或者右边return false;break;case 'd':if(strchr(pleft,c)==NULL)//c没在左边return false;break; }}return true;} 



原创粉丝点击