题意:有A-L个标号的硬币,其中有一个是假币,你不知道假币的轻重,现在给你三个字符串,up代表右面轻,down右面重,even代表两面相等,找出假币并且判断轻重
思路:因为只有A-L个硬币所以枚举一下,假设A是假币,然后判断一下是否满足那三个条件,满足条件的保存
怎么是满足条件,除了不满足条件的,剩下的都满足条件。
不满足条件的
1.两面相等的字符串出现假币,说明假设不成立。
2.右面轻的字符串出现假币在左面轻或者在右面重,说明假设也不成立。
3.右面重的字符串出现假币在左面中或者在右面轻,说明假设也不成立。
不满足上面条件就是假币。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char L[3][10]; char R[3][10]; char heav[3][10]; struct coin { char c; int flag; }; int main() { int t; scanf("%d",&t); while(t--) { int i,j; for(i = 0; i < 3; i++) { scanf("%s%s%s",L[i],R[i],heav[i]); } coin a;a.c = 'A',a.flag = -1; int f; for(i = 0; i < 12; i++) { int flag_L = 0,flag_R = 0;f = -1; for(j = 0; j < 3; j++) { flag_L = 0,flag_R = 0; int len; int len_L = strlen(L[j]),len_R = strlen(R[j]); for(len = 0; len < len_L; len++) { if((i+'A') == L[j][len]) flag_L = 1; } for(len = 0; len < len_R; len++) { if((i+'A') == R[j][len]) flag_R = 1; } if(strcmp(heav[j],"even") == 0 ) { if(flag_L || flag_R) { break; } } else if(strcmp(heav[j],"up") == 0) {//printf("%c\n",i+'A'); if(flag_R && f == 0) break; if(flag_L && f == 1) break; if(!flag_R && !flag_L) break; if(flag_R) { f = 1; } else if(flag_L) { f = 0; } } else if(strcmp(heav[j],"down") == 0) { if(flag_L && f == 0) break; if(flag_R && f == 1) break; if(!flag_R && !flag_L) break; if(flag_L) { f = 1; } if(flag_R) { f = 0; } } } if(j == 3) { a.c = i+'A'; a.flag = f; } } if(a.flag == 0) printf("%c is the counterfeit coin and it is heavy.\n",a.c); else printf("%c is the counterfeit coin and it is light.\n",a.c); } return 0; }