硬币称重,经典,1.若被判平,左右所有硬币必正常;2.若判轻或判重,对应硬币被判轻-1、重记数+1;3.只有球只被判轻或判重,且次数跟天平不平衡次数相等,该球才能是坏的,否则必然是好的。且>0的是偏重,<0是偏轻.
#include<stdio.h> #include<string.h> #include<stdlib.h> int main(void) { int s[15]; int i,j,t,len1,len2,count=0; char str[3][3][13]; scanf("%d",&t); while(t--) { count=0;/*不平衡的次数*/ for(i=0;i<3 ;i++ ) scanf("%s%s%s",str[i][0],str[i][1],str[i][2]); memset(s,0,sizeof(s)); for(i=0;i<3;i++)/*找到所有相等的 */ { if(strcmp(str[i][2],"even")==0) { len1=strlen(str[i][0]); for(j=0;j<len1;j++) s[(str[i][0][j]-'A')]=1000;/*赋值1000表示正常*/ len2=strlen(str[i][1]); for(j=0;j<len2;j++) s[(str[i][1][j]-'A')]=1000; } } for(i=0;i<3;i++) { if(strcmp(str[i][2],"up")==0) { count++; len1=strlen(str[i][0]);/*up说明左边重 */ for(j=0;j<len1;j++) { if(s[(str[i][0][j]-'A')]!=1000) s[(str[i][0][j]-'A')]++; } len2=strlen(str[i][1]);/*右边比较小 */ for(j=0;j<len2;j++) { if(s[(str[i][1][j]-'A')]!=1000) { s[(str[i][1][j]-'A')]--; } } } } for(i=0;i<3;i++) { if(strcmp(str[i][2],"down")==0) { count++; len1=strlen(str[i][0]);/*down说明左边小 */ for(j=0;j<len1;j++) { if(s[(str[i][0][j]-'A')]!=1000) { s[(str[i][0][j]-'A')]--; } } len2=strlen(str[i][1]);/*右边左边都正常 */ for(j=0;j<len2;j++) { if(s[(str[i][1][j]-'A')]!=1000) { s[(str[i][1][j]-'A')]++; } } } } for(i=0;i<12;i++) { if(abs(s[i])==count)/*当不平衡的次数和硬币的问题次数相等时,那么该硬币就是问题硬币*/ { printf("%c is the counterfeit coin and ",i+'A'); printf( s[i]<0? "it is light. ":"it is heavy. "); break; } } } return 0; } /* 自己例举的测试实例 2 ABCD EFGH down CDEF GHLK even AEFD JKCD down B A down B C even D F even */