您的位置:首页 > 编程语言 > C语言/C++

OpenJudge百炼-2692-假币问题-C语言-枚举

2017-08-14 22:26 1896 查看
描述:

赛利有12枚银币。其中有11枚真币和1枚假币。假币看起来和真币没有区别,但是重量不同。但赛利不知道假币比真币轻还是重。于是他向朋友借了一架天平。朋友希望赛利称三次就能找出假币并且确定假币是轻是重。例如:如果赛利用天平称两枚硬币,发现天平平衡,说明两枚都是真的。如果赛利用一枚真币与另一枚银币比较,发现它比真币轻或重,说明它是假币。经过精心安排每次的称量,赛利保证在称三次后确定假币。

输入:

第一行有一个数字n,表示有n组测试用例。

对于每组测试用例:

输入有三行,每行表示一次称量的结果。赛利事先将银币标号为A-L。每次称量的结果用三个以空格隔开的字符串表示:天平左边放置的硬币 天平右边放置的硬币 平衡状态。其中平衡状态用``up'', ``down'', 或 ``even''表示, 分别为右端高、右端低和平衡。天平左右的硬币数总是相等的。

输出:

输出哪一个标号的银币是假币,并说明它比真币轻还是重(heavy or light)。

样例输入:

1

ABCD EFGH even 

ABCI EFJK up 

ABIJ EFGH even 

样例输出:

K is the counterfeit coin and it is light. 


/*************************************************
**文件名:百炼-2692
**Copyright (c) 2015-2025 OrdinaryCrazy
**创建人:OrdinaryCrazy
**日期:20170814
**描述:百炼2692参考答案
**版本:1.0
**************************************************/
#include <stdio.h>
#include <string.h>
char left[3][7],right[3][7],result[3][5];
/*************************************************
**函数名:f
**输入:c-硬币编号,heavy-需要判断的状态,1表示假币重,0表示假币轻
**输出:这种情况成立则输出1,否则输出0
**************************************************/
int f(char c,int heavy)
{
int i;
for(i = 0;i < 3;i++)
switch(result[i][0])
{
case 'e' : if(strchr(right[i],c) != NULL || strchr(left[i],c) != NULL) return 0;
break;
case 'u' : if(heavy)
{if(strchr(left[i],c) == NULL) return 0;}
else
{if(strchr(right[i],c) == NULL) return 0;}
break;
case 'd' : if(heavy)
{if(strchr(right[
4000
i],c) == NULL) return 0;}
else
{if(strchr(left[i],c) == NULL) return 0;}
break;
}
return 1;
}
int main()
{
int n,i;
char c;
scanf("%d",&n);
while(n--)
{
for(i = 0;i < 3;i++)
scanf("%s%s%s",left[i],right[i],result[i]);
for(c = 'A';c < 'M';c++)
{
if(f(c,1))
{
printf("%c is the counterfeit coin and it is heavy.\n",c);
break;
}
if(f(c,0))
{
printf("%c is the counterfeit coin and it is light.\n",c);
break;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: