题意就是12个硬币,11真,1假,假币轻或重未知,给出三次称量结果,找出假币。
由于只有1个假币,而且题目说明答案唯一,那么设两个数组light和heavy,分别对应假币轻和假币重的情况。
如果称量结果是even,那么天平左右的硬币均为真;
如果称量结果是up(右边),那么假币轻的情况下左边天平和没称的均为真,假币重的情况下右边天平和没称的均为真;
如果称量结果是down(右边),那么假币轻的情况下右边天平和没称的均为真,假币重的情况下左边天平和没称的均为真。

最终我们得到的light和heavy数组中,必然有且仅有一个数组中仅一个币与其他币不一样(假币为0,真币为1)。按格式输出即可。

#include<stdio.h>
#include<string.h>
int light[12] = {0}; // 假币轻的情况
int heavy[12] = {0}; // 假币重的情况
char left[13],right[13],res[5];

int main()
{
    int n = 3;
    while(scanf("%s%s%s",left,right,res) != EOF && n)
    {
        int l = strlen(left);
        int r = strlen(right);
        if(!strcmp(res,"up")) // 右边轻
        {
            // 假币轻的情况,左边和没称的全为真
            for(int i = 0;i<l;i++)
                light[left[i]-'A'] = 1;
            for(int i = 0;i<12;i++)
            {
                if(!strrchr(left,i+'A') && !strrchr(right,i+'A'))
                    light[i] = 1;
            }
            // 假币重的情况,右边和没称的全为真
            for(int i = 0;i<r;i++)
                heavy[right[i]-'A'] = 1;
            for(int i = 0;i<12;i++)
            {
                if(!strrchr(left,i+'A') && !strrchr(right,i+'A'))
                    heavy[i] = 1;
            }
        }
        else if(!strcmp(res,"down")) // 右边重
        {
            // 假币轻的情况,右边和没称的全为真
            for(int i = 0;i<r;i++)
                light[right[i]-'A'] = 1;
            for(int i = 0;i<12;i++)
            {
                if(!strrchr(left,i+'A') && !strrchr(right,i+'A'))
                    light[i] = 1;
            }
            // 假币重的情况,左边和没称的全为真
            for(int i = 0;i<l;i++)
                heavy[left[i]-'A'] = 1;
            for(int i = 0;i<12;i++)
            {
                if(!strrchr(left,i+'A') && !strrchr(right,i+'A'))
                    heavy[i] = 1;
            }
        }
        else // 天平两边均为真币
        {
            for(int i = 0;i<l;i++)
            {
                light[left[i]-'A'] = 1;
                heavy[left[i]-'A'] = 1;
            }
            for(int i = 0;i<r;i++)
            {
                light[right[i]-'A'] = 1;
                heavy[right[i]-'A'] = 1;
            }
        }
        n --;
    }
    int cntl = 0,cnth = 0; // 计数light和heavy中0的个数
    int ansl,ansh;
    //先计数light
    for(int i = 0;i<12;i++)
    {
        if(!light[i])
        {
            ansl = i;
            cntl++;
        }
        if(!heavy[i])
        {
            ansh = i;
            cnth++;
        }
    }
    if(cntl == 1) // 假币轻
        printf("%c is the counterfeit coin and it is light.\n",'A'+ansl);
    else // 假币重
        printf("%c is the counterfeit coin and it is heavy.\n",'A'+ansh);
}