称硬币

有12个硬币, 其中有一个是假的,我们不知道假的硬币是比正常的硬币轻或重,现在用一个只可以比较两端重量的等臂天平,秤 3 次,把假的硬币找出来。(没有砝码或其它的辅助工具)
郭炜老师的代码:

#include<iostream>
#include<cstdio>
#include<cstring> 
using namespace std;
char Left[3][7];//天平左边硬币 
char Right[3][7];// 天平右边硬币 
char Result[3][7];//结果
bool IsFake(char c, bool light);//light为真表示假设假币为轻,否则假币为重
int main(){
	int t;//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){
	for(int i=0; i<3; ++i){
		char *pLeft,*pRight;
		if(light){
			pLeft=Left[i];
			pRight=Right[i];
		}
		else{//如果假设假币是重的,则把称量结果左右对换 
			pLeft=Right[i];
			pRight=Left[i];
		}
		switch(Result[i][0]){//天平右边的情况
		    case 'u':
		  	    if(strchr(pRight,c)==NULL)
		  	        return false;
		  	    break;
		    case 'e':
		  	    if(strchr(pRight,c)==NULL||strchr(pLeft,c)==NULL)
		  	        return false;
		  	    break;
		    case 'd':
		  	    if(strchr(pLeft,c)==NULL)
		  	        return false;
		  	    break;
		}	 
	}
	return true;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值