程序设计与算法笔记之称硬币

称硬币
有12枚硬币。其中有11枚真币和1枚假币。假币和真
币重量不同,但不知道假币比真币轻还是重。现在,
用一架天平称了这些币三次,告诉你称的结果,请你
找出假币并且确定假币是轻是重(数据保证一定能找
出来)。
 输入
第一行是测试数据组数。
每组数据有三行,每行表示一次称量的结果。银币标号
为A-L。每次称量的结果用三个以空格隔开的字符串表示:
天平左边放置的硬币 天平右边放置的硬币 平衡状态。其
中平衡状态用up'',down’’, 或 even''表示, 分 别为右端高、右端低和平衡。天平左右的硬币数总是相等 的。  输出 输出哪一个标号的银币是假币,并说明它比真币轻还是重。 例题:POJ1013 称硬币  输入样例 1 ABCD EFGH even ABCI EFJK up ABIJ EFGH even  输出样例 K is the counterfeit coin and it is light. 例题:POJ1013 称硬币  解题思路 先假定不平衡中的都是假币并确定轻重,再逐个扫描查证,最后剩下的是假币。

```cpp
#include<iostream>
using namespace std;
char Left[3][7],Right[3][7],Result[3][7]; //3个2维数组分别存放天平左右和结果 
char  IsFake(char c ){ //返回称量结果 重就是'H' ,轻就是'L' ,真币返回0; 
	char r=0;
	for(int i=0;i<3;++i){  
		for(int j=0;j<=3;++j){
			if(Result[i][0]=='U'){
				if(Left[i][j]==c)r='H';  //出现这种情况先假设这个硬币为重的 
				if(Right[i][j]==c)r='L';
			}
			if(Result[i][0]=='D'){
				if(Left[i][j]==c)r='L';
				if(Right[i][j]==c)r='H';	
			}
		}
	}
	for(int i=0;i<3;++i)
		for(int j=0;j<=3;++j){
			if(Result[i][0]=='E'&&(Left[i][j]==c||Right[i][j]==c))r=0;//天平平衡而有该硬币出现,更正结果为0 
			if(r=='H' && Result[i][0]=='U' && Right[i][j]==c)r=0; //如果假设是重的且天平上翘而该硬币出现在右边,就否定假设, 
			if(r=='L' && Result[i][0]=='D' && Left[i][j]==c)r=0; 
		}
	return r;	
}
int main(){
	int t;
	cin>>t;
	//freopen("d\\cyb.txt","r",stdin);
	while(t--){
		for(int i=0;i<3;++i)
			cin>>Left[i]>>Right[i]>>Result[i];
		for(char c='A';c<='L';c++){ 
			char r=IsFake(c);
			if(r=='L')cout<<c<<" is the counterfeit coin and it is light.\n";
			if(r=='H')cout<<c<<" is the counterfeit coin and it is heavy.\n";
		}
	}
	return 0;
}
发布了5 篇原创文章 · 获赞 0 · 访问量 57

猜你喜欢

转载自blog.csdn.net/qq_35076612/article/details/104434429