称硬币(中国大学慕课程序设计与算法二)

题目描述:

有12枚硬币,其中只有一枚是假币,假币和真币的重量不同。现将这些硬币称了三次,告诉你称的结果,找出假币并确定假币是轻还是重。

输入:

  • 第一行给出测试组数
  • 每组数据有三行,每行表示一次称量的结果,硬币标号A~L,每次称量的结果用三个字符串分别表示 天平左端放置的硬币 右端放置的硬币 平衡状态(相对于右端)
  • 左右两端的硬币总是相等的

输出:

输出哪一个是假币并说明比正币重还是轻

输入样例:
1
ABCD EFGH even
ABCI EFJK up
ABIJ EFGH even

输出样例:

K is the counterfeit coin and it is light.

小分析:

已知称量结果,我们可以用枚举的方法找到不合格的硬币,从A硬币到L硬币,依次判断它的轻重情况

#include <bits/stdc++.h>
using namespace std;
string a[3],b[3];
string s[3];
bool IsFake(char c,bool bl){
	for(int i=0;i<3;i++){
		string pa,pb;//pa表示左边的假币,pb表示右边的假币
		if(bl){//轻
			pa=a[i];
			pb=b[i];
		}
		else{//重的话左右要颠倒一下
			pa=b[i];
			pb=a[i];
		}
		switch(s[i][0]){
			case 'u':
				if(pb.find(c)==-1)return false;//find()函数--c++STL标准库string(必须要会)
				break;
			case 'e':
				if(pa.find(c)!=-1||pb.find(c)!=-1)return false;
				break;
			case 'd':
				if(pa.find(c)==-1)return false;
				break;
		}
	}
	return true;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		for(int i=0;i<3;++i)cin>>a[i]>>b[i]>>s[i];
		for(char c='A';c<='L';c++){
			if(IsFake(c,true)){    //假币是轻的
				cout<<c<<" is the counterfeit coin and it is light."<<endl;
				break;
			}
			else if(IsFake(c,false)){  //假币是重的
				cout<<c<<" is the counterfeit coin and it is heavy."<<endl;
				break;
			}
		//	cout<<c<<endl;
		}
	}
	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值