题意就是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);
}
京公网安备 11010502036488号