可以参考http://www.slyar.com/blog/poj-1013-c.html上的测试用例
#include<stdio.h>
#include<string.h>
#define ABS(x) (x)>0?(x):(-x)
int main()
{
int i, j, k, n;
char left[3][7],right[3][7];//分别存储左右两边
int result[3] = {0};//分别存储三组输入的结果,为0表示even,为1表示右边up,为2表示右边down
char reflect[12] = {'A','B','C','D','E','F','G','H','I','J','K','L'};
int identify[12];//存储对12枚硬币(A,B,C...)的判断结果,大于1表示为假且重,等于0或1表示真,小于0表示为假且轻
char s[5];
int min,max,min_index,max_index;
scanf("%d", &n);
for(i=0; i<n; i++)
{
memset(identify, 0, sizeof(int)*12);
min = 6;
max = -6;
for(j=0; j<3; j++)
{
scanf("%s %s %s", left[j], right[j], s);
if(strncmp(s, "even", 4)==0)//如果是even,说明左右两边的硬币都是真的
{
k = 0;
while(left[j][k]!='\0')//两边相等则说明两边所放的硬币都是真的,将其标记为1,以后不再修改
{
identify[left[j][k]-'A'] = 1;
identify[right[j][k]-'A'] = 1;
k++;
}
}
else if(strncmp(s, "up", 2)==0)//右边轻
{
k = 0;
while(left[j][k]!='\0')//左右两边硬币个数是相同的,只用判断一边
{
if(identify[left[j][k]-'A'] != 1)
{
identify[left[j][k]-'A'] = identify[left[j][k]-'A']+2;
}
if(identify[right[j][k]-'A'] != 1)
{
identify[right[j][k]-'A'] = identify[right[j][k]-'A']-2;
}
k++;
}
}
else if(strncmp(s, "down", 4)==0)//右边重
{
k = 0;
while(left[j][k]!='\0')
{
if(identify[left[j][k]-'A'] != 1)
{
identify[left[j][k]-'A'] = identify[left[j][k]-'A']-2;
}
if(identify[right[j][k]-'A'] != 1)
{
identify[right[j][k]-'A'] = identify[right[j][k]-'A']+2;
}
k++;
}
}
}
for(k=0; k<12; k++)
{
if(identify[k]>1 && identify[k]>max)
{
max = identify[k];
max_index = k;
}
if(identify[k]<0 && identify[k]<min)
{
min = identify[k];
min_index = k;
}
}
if(ABS(min)<max)
printf("%c is the counterfeit coin and it is heavy.\n", reflect[max_index]);
else
printf("%c is the counterfeit coin and it is light.\n", reflect[min_index]);
}
return 0;
}