题意:有一个天平,和12枚硬币(有一枚是假的),用A~L表示,但是不一定每个字母都会出现。现在有三次称量结果,求一枚假硬币,每个样例都有解。
这个问题可以利用标记的次数来判断,标记的次数越多则可以认为是假的。
abs()函数求绝对值,头文件是#include<stdlib.h>
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include<string.h>
int main()
{
int n;
scanf("%d",&n);
int flag[12]; //对每次天平状态进行记录
char p1[15],p2[15],updown[10];
while(n--)
{
int f; //注意作用域
memset(flag,0,sizeof(flag));
for(int t = 0;t < 3; t++)
{
scanf("%s%s%s",p1,p2,updown);
int lenth = strlen(p1); //题意中p1 p2的长度相同
if(strcmp(updown,"even") == 0)
{
for(int i = 0;i < lenth; i++) //标记为真
{
flag[p1[i] - 'A'] = 12;
flag[p2[i] - 'A'] = 12;
}
}
if(strcmp(updown,"up") == 0)
{
for(int i = 0;i < lenth; i++)
{
if(flag[p1[i] - 'A'] != 12) //如果是真,则不改变
flag[p1[i] - 'A']++;
if(flag[p2[i] - 'A'] != 12)
flag[p2[i] - 'A']--;
}
}
if(strcmp(updown,"down") == 0)
{
for(int i = 0;i < lenth; i++)
{
if(flag[p1[i] - 'A'] != 12)
flag[p1[i] - 'A']--;
if(flag[p2[i] - 'A'] != 12)
flag[p2[i] - 'A']++;
}
}
int maxn = 0;
f = 0; //用作标记假的位置
for(int i = 0;i < 12; i++)
{
if(flag[i] == 12)
continue;
if(maxn < abs(flag[i]))
{
maxn = abs(flag[i]);
f = i;
}
}
}
if(flag[f] > 0) //重的一方在加,所以大于零
printf("%c is the counterfeit coin and it is heavy.\n",f+'A');
if(flag[f] < 0)
printf("%c is the counterfeit coin and it is light.\n",f+'A');
}
return 0;
}