POJ 1013 假币问题(水题)

大致题意:

有一打(12枚)硬币,其中有且仅有1枚假币,11枚真币

用A~L作为各个硬币的代号

假币可能比真币略轻,也可能略重

现在利用天枰,根据Input输入的3次称量,找出假币,并输出假币是轻还是重。

解题思路:暴力枚举:枚举每个硬币为轻的假币、重的假币,如果不满足3个称量结果,继续寻找,直到找到满足的。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
char Left[5][10],Right[5][10],balance[5][10];
bool is_right(char ch,char weight,int k)
{
	if(balance[k][0]=='e')
	{	//判断左边 和右边 
		if(strchr(Left[k],ch) == NULL&&strchr(Right[k],ch)== NULL)
			return true; 
		else 
			return false;
	}
	else if(balance[k][0]=='u')
	{
		if(weight=='L')
		{
			if(strchr(Right[k],ch)==NULL)
				return false;
			else
				return true;
		}
		else if(weight=='H')
		{
			if(strchr(Left[k],ch)==NULL)
				return false;
			else
				return true;
		}	
	}
	else if(balance[k][0]=='d')
	{
		if(weight=='H')
		{
			if(strchr(Right[k],ch)==NULL)
				return false;
			else
				return true;
		}
		else if(weight=='L')
		{
			if(strchr(Left[k],ch)==NULL)
				return false;
			else
				return true;
		}	
	}
}
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		memset(Left,0,sizeof(Left));
		memset(Right,0,sizeof(Right));
		memset(balance,0,sizeof(balance));
		for(int i=1;i<=3;i++)
			cin>>Left[i]>>Right[i]>>balance[i];
		for(int i=0;i<12;i++)
		{
			//假设轻 
			int flag=1;
			for(int j=1;j<=3;j++)
			{
				if(!is_right(i+65,'L',j))
				{
					flag=0;
					break;
				}
			}
			if(flag)
			{
				printf("%c is the counterfeit coin and it is light.\n",i+65);
				break;
			}
			//假设重
			flag=1;
			for(int j=1;j<=3;j++)
			{
				if(!is_right(i+65,'H',j))
				{
					flag=0;
					break;
				}
			}
			if(flag)
			{
				printf("%c is the counterfeit coin and it is heavy.\n",i+65);
				break;
			}
		}
	}
 } 
发布了17 篇原创文章 · 获赞 0 · 访问量 460

猜你喜欢

转载自blog.csdn.net/weixin_43786756/article/details/100015026