POJ 1013 Counterfeit Dollar

本文介绍了一种通过三轮称量找出至多12个硬币中唯一假币的算法,假币可能是轻的也可能是重的。通过输入三组称量结果,程序能够输出假币的编号以及其相对于真币的重量状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                                                                           简单的枚举

题目大意:

                 至多有12个硬币,编号A-L,里面有一枚假币。多组数据,每组给出三次称量结果(even,up,down),保证可以找到假币,要求你输出假币编号并指出假币是比真币轻还是比真币重。

起初对所有硬币标记0;如果是even,则两边所有的硬币都是真的(记10);否则就对不确定的硬币记录怀疑(++或者--);最后只要看哪个硬币的绝对值最大,也就是被怀疑的次数最多,即是假币。


#include <stdio.h>
#include <string.h>

char left[3][7];
char right[3][7];
char result[3][5];

bool isHeavy(char);
bool isLight(char);

int main()
{
    freopen("in.txt","r",stdin);
    int n;
    char c;
    scanf("%d",&n);
    while(n--)
    {
        for(int i=0; i<3; i++)
        {
            scanf("%s%s%s",left[i],right[i],result[i]);
        }
        for(c='A'; c<='L'; c++)
        {
            if(isLight(c))
            {
                printf("%c is the counterfeit coin and it is light.\n",c);
                break;
            }

            if(isHeavy(c))
            {
                printf("%c is the counterfeit coin and it is heavy.\n",c);
                break;
            }
        }
    }
    return 0;
}

bool isLight(char x)
{
    for(int i=0; i<3; i++)
    {
        switch(result[i][0])
        {
        case 'u':
            if(strchr(right[i],x)==NULL) return false;
            break;
        case 'e':
            if(strchr(right[i],x)!=NULL||strchr(left[i],x)!=NULL) return false;
            break;
        case 'd':
            if(strchr(left[i],x)==NULL) return false;
            break;
        }
    }
    return true;
}

bool isHeavy(char x)
{
    for(int  i=0; i<3; i++)
    {
        switch(result[i][0])
        {
        case 'u':
            if(strchr(left[i],x)==NULL) return false;
            break;
        case 'e':
            if(strchr(left[i],x)!=NULL||strchr(right[i],x)!=NULL) return false;
            break;
        case 'd':
            if(strchr(right[i],x)==NULL) return false;
            break;
        }
    }
    return true;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值