可以參考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;
}