1. 程式人生 > >C++第11周專案2(6)參考——誰是小偷?

C++第11周專案2(6)參考——誰是小偷?

【專案2:窮舉法解決組合問題】先閱讀例題,領會窮舉法(意為“窮盡式列舉”,也稱列舉)的思想,然後自行選題進行解決,掌握這種程式設計的一般方法。

任務:利用窮舉的方法解決下面的問題(選做一道即算完成任務,其他可以抽時間自由安排,多做會使你更聰明。)

6)警察局抓住了ABCD四名盜竊嫌疑犯,其中只有一人是小偷。在審問時,A說:“我不是小偷”;B說:“C是小偷”;C說:“小偷肯定是D”;D說:“C在冤枉好人”。現在已經知道這四人中有三人說的是真話,一人說的是假話。請問到底誰是小偷?

提示:設4個變數a,b,c,d,為0時表示不是小偷,為1時表示是小偷,用四重迴圈窮舉a,b,c,d可能的取值的組合,對每一種組合判斷其是否符合題目中給出的約束。最後結論:

C是小偷。

#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語句部分)的寫法,理解了,就又是一個提高!要點,例:

a0!a1,a1!a0,等同於a==0a!=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;
}