poj1013

来源:互联网 发布:人工智能电影国语 编辑:程序博客网 时间:2024/05/21 06:36

可以参考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表示右边downchar 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]);elseprintf("%c is the counterfeit coin and it is light.\n", reflect[min_index]);}return 0;}