枚举算法称硬币C语言,【算法系列之枚举】称硬币
題目
有12枚硬幣。其中有11枚真幣和1枚假幣。假幣和真 幣重量不同,但不知道假幣比真幣輕還是重?,F(xiàn)在, 用一架天平稱了這些幣三次,告訴你稱的結果,請你 找出假幣并且確定假幣是輕是重(數(shù)據(jù)保證一定能找 出來)。
輸入
第一行是測試數(shù)據(jù)組數(shù)。 每組數(shù)據(jù)有三行,每行表示一次稱量的結果。銀幣標號 為A-L。每次稱量的結果用三個以空格隔開的字符串表示: 天平左邊放置的硬幣 天平右邊放置的硬幣 平衡狀態(tài)。其 中平衡狀態(tài)用``up‘‘, ``down‘‘, 或 ``even‘‘表示, 分 別為右端高、右端低和平衡。天平左右的硬幣數(shù)總是相等 的。
輸出
輸出哪一個標號的銀幣是假幣,并說明它比真幣輕還是重。
輸入樣例
1
ABCD EFGH even
ABCI EFJK up
ABIJ EFGH even
輸出樣例
K is the counterfeit coin and it is light.
解題思路
對于每一枚硬幣先假設它是輕的,看這樣是否符合 稱量結果。如果符合,問題即解決。如果不符合,就 假設它是重的,看是否符合稱量結果。把所有硬幣都 試一遍,一定能找到特殊硬幣
完整代碼
1 #include
2 #include
3 using namespacestd;4 char Left[3][7]; //天平左邊硬幣,3代表3次稱量情況,7代表硬幣數(shù)
5 char Right[3][7]; //天平右邊硬幣
6 char result[3][7]; //結果
7 bool IsFake(char c,boollight) ;8 //light 為真表示假設假幣為輕,否則表示假設假幣為重
9 intmain() {10 intt; //測試數(shù)據(jù)組數(shù)11 cin >>t;12 while(t--) {13 for(int i = 0;i < 3; ++i) cin >> Left[i] >> Right[i]>>result[i];14 for(char c=‘A‘; c<=‘L‘;c++) {15 if( IsFake(c,true) ){16 cout << c << "is the counterfeit coin and it is light.\n";17 break;18 }19 else if( IsFake(c,false) ){20 cout << c << "is the counterfeit coin and it is heavy.\n";21 break;22 }23 }24 }25 return 0;26 }27 bool IsFake(char c,boollight)28 //light 為真表示假設假幣為輕,否則表示假設假幣為重
29 {30 for(int i = 0;i < 3; ++i) {31 char * pLeft,*pRight; //指向天平兩邊的字符串
32 if(light) {33 pLeft =Left[i];34 pRight =Right[i];35 }36 else{37 pLeft =Right[i];38 pRight =Left[i];39 }40 switch(result[i][0]) {41 case ‘u‘:42 if ( strchr(pRight,c) ==NULL)43 return false;44 break;45 case ‘e‘:46 if( strchr(pLeft,c) ||strchr(pRight,c))47 return false;48 break;49 case ‘d‘:50 if ( strchr(pLeft,c) ==NULL)51 return false;52 break;53 }54 }55 return true;56 }
原文:http://www.cnblogs.com/vinpho/p/7197843.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的枚举算法称硬币C语言,【算法系列之枚举】称硬币的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php server自定义函数,php:
- 下一篇: jieba结巴分词--关键词抽取_结巴中