C++第11週プロジェクト2(6)参考--誰が泥棒ですか?

2291 ワード

コースのトップページアドレス:http://blog.csdn.net/sxhelijian/article/details/7910565
【項目2:貧挙法解決組合せ問題】まず例題を読み、貧挙法(「窮尽式列挙」を意味し、列挙とも呼ばれる)の思想を理解し、それから自分で問題を選んで解決し、このようなプログラム設計の一般的な方法を身につける.
タスク:貧乏な方法で次の問題を解決します(1つを選ぶとすぐにタスクを完成します.他は時間を割いて自由に手配することができます.多くすると、あなたをもっと賢くすることができます.)
(6)警察署はA、B、C、Dの窃盗容疑者4人を逮捕し、そのうち1人だけが泥棒だった.尋問の時、Aさんは「私は泥棒ではありません」と言いました.Bは「Cは泥棒だ」と言った.Cは「泥棒はDに違いない」と言った.Dは「Cは善人に濡れ衣を着せている」と言った.この4人のうち3人が本当のことを言っていることが分かり、1人がうそをついている.いったい誰が泥棒ですか?
ヒント:4つの変数a,b,c,dを設定し、0の場合泥棒ではないことを示し、1の場合泥棒であることを示し、4重サイクルで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文部分)という書き方に注意して、理解して、また1つアップ!要点、例:
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;
}