假币问题详解(枚举的经典例题)
OpenJudge-百練-2692:假幣問(wèn)題
總時(shí)間限制: 1000ms 內(nèi)存限制: 65536kB
描述
賽利有12枚銀幣。其中有11枚真幣和1枚假幣。假幣看起來(lái)和真幣沒(méi)有區(qū)別,但是重量不同。但賽利不知道假幣比真幣輕還是重。于是他向朋友借了一架天平。朋友希望賽利稱(chēng)三次就能找出假幣并且確定假幣是輕是重。例如:如果賽利用天平稱(chēng)兩枚硬幣,發(fā)現(xiàn)天平平衡,說(shuō)明兩枚都是真的。如果賽利用一枚真幣與另一枚銀幣比較,發(fā)現(xiàn)它比真幣輕或重,說(shuō)明它是假幣。經(jīng)過(guò)精心安排每次的稱(chēng)量,賽利保證在稱(chēng)三次后確定假幣。
輸入
第一行有一個(gè)數(shù)字n,表示有n組測(cè)試用例。
對(duì)于每組測(cè)試用例:
輸入有三行,每行表示一次稱(chēng)量的結(jié)果。賽利事先將銀幣標(biāo)號(hào)為A-L。每次稱(chēng)量的結(jié)果用三個(gè)以空格隔開(kāi)的字符串表示:天平左邊放置的硬幣 天平右邊放置的硬幣 平衡狀態(tài)。其中平衡狀態(tài)用"up", “down”, 或 "even"表示,分別為右端高、右端低和平衡。天平左右的硬幣數(shù)總是相等的。
輸出
輸出哪一個(gè)標(biāo)號(hào)的銀幣是假幣,并說(shuō)明它比真幣輕還是重(heavy or light)。
樣例輸入
1 ABCD EFGH even ABCI EFJK up ABIJ EFGH even樣例輸出
K is the counterfeit coin and it is light.題目來(lái)源鏈接如下:
http://bailian.openjudge.cn/practice/2692/
題解
這是一道稍微偏難的枚舉題目。對(duì)于每一枚硬幣先假設(shè)它是輕的,看這樣是否符合稱(chēng)量結(jié)果。如果符合,問(wèn)題即解決。如果不符合,就假設(shè)它是重的,看是否符合稱(chēng)量結(jié)果。把所有硬幣都試一遍(從字符’A’到字符’L’共12枚硬幣),就一定能找到特殊硬幣也就是假幣。
代碼如下:
#include<iostream> #include<cstring> using namespace std; char Left[3][7];//天平左邊硬幣 char Right[3][7];//天平右邊硬幣 char Result[3][7];//結(jié)果 bool IsFake(char c,bool light);//light為真表示假設(shè)假幣為輕,否則表示假設(shè)假幣為重 int main() {int t;cin >> t;while(t--){for(int i=0; i<3; ++i)cin >> Left[i] >> Right[i] >> Result[i];for(char c='A'; c<='L'; c++)//從字符'A'到字符'L'枚舉12枚硬幣{if(IsFake(c,true))//假設(shè)假幣為輕{cout << c << " is the counterfeit coin and it is light." << endl;break;}else if(IsFake(c,false))//假設(shè)假幣為重{cout << c << " is the counterfeit coin and it is heavy." << endl;break;}}}return 0; } bool IsFake(char c,bool light)//light為真表示假設(shè)假幣為輕,否則表示假設(shè)假幣為重 {for(int i=0; i<3; ++i){char * pL, * pR;//定義了2個(gè)char類(lèi)型的指針?lè)謩e指向天平兩邊的字符串 if(light){pL=Left[i];pR=Right[i];}else//如果假設(shè)假幣是重的,則把稱(chēng)量結(jié)果左右對(duì)換 {pL=Right[i];pR=Left[i];}switch(Result[i][0])//天平右邊的情況 {case 'u':if(strchr(pR,c) == NULL)return false;break;case 'e':if(strchr(pR,c) || strchr(pL,c))return false;break;case 'd':if(strchr(pL,c) == NULL)return false;break;}}return true; }這里解釋一下strchr函數(shù)。strchr函數(shù)功能為在一個(gè)串中查找給定字符的第一個(gè)匹配之處。函數(shù)原型為:char *strchr(const char *str, int c),即在參數(shù) str 所指向的字符串中搜索第一次出現(xiàn)字符 c(一個(gè)無(wú)符號(hào)字符)的位置。該函數(shù)返回在字符串 str 中第一次出現(xiàn)字符 c 的位置,如果未找到該字符則返回 NULL。
那么我們就上述代碼說(shuō)明一下:
'u’表明天平右端高(up),這時(shí)就有兩種可能。第一種可能就是假幣輕在天平右端。第二種可能就是假幣重在天平左端。
假設(shè)此時(shí)我們枚舉的這枚硬幣為假幣且為輕也就是參數(shù)light為true,那么指針pR也就指向天平右邊字符串。strchr(pR,c)就是說(shuō)在pR所指向的右邊字符串中搜索第一次出現(xiàn)字符c的位置(字符c就是我們枚舉的這枚硬幣),如果沒(méi)找到返回NULL,那么strchr(pR,c) == NULL為真,函數(shù)返回false,說(shuō)明假設(shè)假幣為輕不對(duì)。
那么我們?cè)偌僭O(shè)這枚硬幣為假幣且為重也就是參數(shù)light為false,那么指針pR也就指向天平左邊字符串。strchr(pR,c)就是說(shuō)在pR所指向的左邊字符串中搜索第一次出現(xiàn)字符c的位置,如果還沒(méi)有找到同樣返回NULL,那么strchr(pR,c) == NULL為真,函數(shù)返回false,說(shuō)明假設(shè)假幣為重也不行,所以這枚硬幣就不是假幣,那么接著枚舉下一個(gè)字符也就是硬幣。
感謝觀看!若有錯(cuò)誤還請(qǐng)指出,如果有什么不懂的也可以留言。
總結(jié)
以上是生活随笔為你收集整理的假币问题详解(枚举的经典例题)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Taylor Swift - Encha
- 下一篇: ShowWindow的nCmdShow参