POJ1013假币问题--枚举

POJ1013 假币问题 枚举 暴力

题干:一共十二枚银币,一枚假的,注意就一枚是假的,假币重量与真币不同。通过三次称重来判别真假硬币,并判断比真的轻还是重,测量结果,up,down,even分别表示右盘轻了,右盘重了,平衡。硬币用A~L表示;
解题思路:枚举假设硬币是轻的,看是否符合每一个测量结果,符合这枚硬币就是假硬币,轻;否则假设硬币是重的,看是否符合每一个测量结果,把所有的硬币测量一边,即可以找到结果

在这里插入图片描述

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char L[3][7];		//三组左盘硬币 
char R[3][7];		//三组右盘硬币 
char result[3][7];//三组结果

bool isfake(char c,bool light)  //枚举假设每个硬币都是轻的  指状态为up 即右边轻 
{
	for(int i=0;i<3;i++)
	{
		char *pleft,*pright;
		if(light) //右边轻 
		{
			pleft=L[i];    
			pright=R[i];
		}
		else //当左边轻的时候  交换两个盘  
		{ 
			pleft=R[i]; 
			pright=L[i];
		}
		switch(result[i][0])  //检查输入结果   
		{
			case'u':if(strchr(pright,c)==NULL) return false; //up即对应右边轻,右边有 break  否则 false 
					break;
			case'e':if(strchr(pleft,c)|| strchr(pright,c)) return false;// 只要是有 他就不是假币,false 否则break 
					break;
			case'd': if(strchr(pleft,c)==NULL) return false;// 找到 break 否则false 
					break;
		}
	}
	return true; //只有在up或down中找到了这枚硬币,并在even中没有  return true; 
}
int main()
{
	int t;
	cin>>t;				
	while(t--)
	{
		for(int i=0;i<3;i++)
			cin>>L[i]>>R[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;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值