C++第11周專案2(6)參考——誰是小偷?
阿新 • • 發佈:2019-02-04
【專案2:窮舉法解決組合問題】先閱讀例題,領會窮舉法(意為“窮盡式列舉”,也稱列舉)的思想,然後自行選題進行解決,掌握這種程式設計的一般方法。
任務:利用窮舉的方法解決下面的問題(選做一道即算完成任務,其他可以抽時間自由安排,多做會使你更聰明。)
(6)警察局抓住了A、B、C、D四名盜竊嫌疑犯,其中只有一人是小偷。在審問時,A說:“我不是小偷”;B說:“C是小偷”;C說:“小偷肯定是D”;D說:“C在冤枉好人”。現在已經知道這四人中有三人說的是真話,一人說的是假話。請問到底誰是小偷?
提示:設4個變數a,b,c,d,為0時表示不是小偷,為1時表示是小偷,用四重迴圈窮舉a,b,c,d可能的取值的組合,對每一種組合判斷其是否符合題目中給出的約束。最後結論:
#include<iostream> using namespace std; int main() { int a,b,c,d; for(a=1;a>=0;a--) //窮舉每個人是否是小偷的所有情況 for(b=1;b>=0;b--) //1:是小偷 0:不是 for(c=1;c>=0;c--) for(d=1;d>=0;d--) if((a==0)+(c==1)+(d==1)+(d==0)==3&&a+b+c+d==1) //4人的說法中有3個真的,且只有一個小偷 { cout<<"A "<<(a?"":"不")<<"是。"<<endl; cout<<"B "<<(b?"":"不")<<"是。"<<endl; cout<<"C "<<(c?"":"不")<<"是。"<<endl; cout<<"D "<<(d?"":"不")<<"是。"<<endl; } return 0; }
下面一個程式的寫法中,注意“4人的說法中有3個真的”(即if語句部分)的寫法,理解了,就又是一個提高!要點,例:
當a為0時!a為1,a為1時!a為0,等同於a==0及a!=1的值,即
a | !a | a==0 | a!=1 |
0 | 1 | 1 | 1 |
1 | 0 | 0 | 0 |
#include<iostream> using namespace std; int main() { int a,b,c,d; for(a=1;a>=0;a--) //窮舉每個人是否是小偷的所有情況 for(b=1;b>=0;b--) //1:是小偷 0:不是 for(c=1;c>=0;c--) for(d=1;d>=0;d--) if((!a)+(c)+(d)+(!d)==3&&a+b+c+d==1) //!a與a==0或a!=1完全等價,其他同 { cout<<"A "<<(a?"":"不")<<"是。"<<endl; cout<<"B "<<(b?"":"不")<<"是。"<<endl; cout<<"C "<<(c?"":"不")<<"是。"<<endl; cout<<"D "<<(d?"":"不")<<"是。"<<endl; } return 0; }