題意:有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; }
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
