1、爱因斯坦在 20 世纪初出一道逻辑推理题。他说世界上有 98的人答不出来。题目如下: 在一条街上,有 5 座房子,喷了 5 种颜色。每个房里住着不同国籍的人。每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物。 已知条件: 1、英国人住红色房子 2、瑞典人养狗 3、丹麦人喝茶 4、绿色房子在白色房子左面 5、绿色房子主人喝咖啡 6、抽 Pall Mall 香烟的人养鸟 7、黄色房子主人抽 Dunhill 香烟 8、住在中间房子的人喝牛奶 9、 挪威人住第一间房 10、抽 Blends 香烟的人住在养猫的人隔壁 11、养马的人住抽 Dunhill 香烟的人隔壁 12、抽 Blue Master
2、的人喝啤酒 13、德国人抽 Prince 香烟 14、挪威人住蓝色房子隔壁 15、抽 Blends 香烟的人有一个喝水的邻居问谁养鱼? /-首先给出程序运行结果:/-C+解析: 通过 0-4 来标记房子的位置,并规定最左边的位置的标号为 0,最右边的标号为 4。 通过 0-4 来标记国籍、房子颜色、饮料、宠物和烟的牌子。 通过排列组合的方法来选定他们的各种属性的组合。 由于需要组合的信息太大,选取先化简再进行组合的方法。 化简方法如下: 由条件 8-条件 9-条件 14-条件 4-条件 5-条件 1 可以确定的信息如下: *位 置: 0 1 2 3 4 *国 籍: 挪威人 英国人 *房子颜色:
3、 黄色 蓝色 红色 绿色 白色 *饮 料: 牛奶 咖啡 *宠 物: *烟的牌子: 通过排列组合后,同过检测其余的条件,来得到正确的结果。 由此给出 C+实现的代码: /编译环境: DEV-C+ 4.9.9.2 /共两个文件:main.cpp 和 MyDef.h/*File: MyDef.h*Author: Umbrella*Date: 2012/1/29/ 14:35*/#ifndef _MY_DEFINE_H_#define _MY_DEFINE_H_/-#define WIDTH 12/-#define YELLOW 0 /const#define BLUE 1 /const#define
4、 RED 2 /const#define GREEN 3 /const#define WHITE 4 /const/-#define DOG 0#define BIRD 1#define CAT 2#define HORSE 3#define FISH 4/-#define PALLMALL 0#define DUNHILL 1#define BLENDS 2#define BLUEMASTER 3#define PRINCE 4/-#define DANISH 0#define SWEDISH 1#define GERMAN 2#define NORWEGIAN 3 /const#defin
5、e BRITISH 4 /const/-#define TEA 0#define BEER 1#define WATER 2#define COFFEE 3 /const#define MILK 4 /const/-#endif/=文件分割线=/*File: main.cpp*Author: Umbrella*Date: 2012/1/29/ 14:47*/-/*位 置: 0 1 2 3 4 *国 籍: 挪威人 英国人 *房子颜色: 黄色 蓝色 红色 绿色 白色 *饮 料: 牛奶 咖啡 *宠 物: *烟的牌子: */-#include #include #include#include #in
6、clude “MyDef.h“/-using namespace std;/-class cManpublic:int Nationality;int Pos;int Color;int Pet;int Drink;int Smoke;/cMan(int iPos)this-Pos = iPos;this-Nationality = iPos;this-Color = iPos;this-Pet = iPos;this-Drink = iPos;this-Smoke = iPos;/-cMan *Man5; /类指针数组int Num = 0; /答案个数/*#define DANISH 0#
7、define SWEDISH 1#define GERMAN 2#define NORWEGIAN 3 /const#define BRITISH 4 /const*/string strNationality5 = “丹麦人“, “瑞典人 “, “德国人“, “挪威人“, “英国人“;/*#define YELLOW 0 /const#define BLUE 1 /const#define RED 2 /const#define GREEN 3 /const#define WHITE 4 /const*/string strColor5 = “黄色“, “蓝色“, “红色“, “绿色“, “
8、白色“;/*#define DOG 0#define BIRD 1#define CAT 2#define HORSE 3#define FISH 4*/string strPet5 = “狗“, “鸟“, “猫“, “马“, “鱼“;/*#define TEA 0#define BEER 1#define WATER 2#define COFFEE 3 /const#define MILK 4 /const*/string strDrink5 = “茶“, “啤酒“, “水“, “咖啡“, “牛奶“;/*#define PALLMALL 0#define DUNHILL 1#define B
9、LENDS 2#define BLUEMASTER 3#define PRINCE 4*/string strSmoke5 = “PallMall“, “Dunhill“, “Blends“, “BlueMaster“, “Prince“;/-void ShowTest();void Init(); /实例化 对象,并初始化已 经推断出来的信息void End(); /释放对象bool Check(); /判断是否满足剩余条件bool Check2(); /2、瑞典人养狗bool Check3(); /3、丹麦人喝茶bool Check6(); /6、抽 Pall Mall 香烟的人养鸟boo
10、l Check7(); /7、黄色房子主人抽 Dunhill 香烟bool Check10(); /10、抽 Blends香烟的人住在养猫的人隔壁bool Check11(); /11、养马的人住抽 Dunhill 香烟的人隔壁bool Check12(); /12、抽 Blue Master的人喝啤酒bool Check13(); /13、德国人抽 Prince香烟bool Check15(); /15、抽 Blends香烟的人有一个喝水的邻居void Calculate(); /进行计算void NationalityCycle();/国籍循环void DrinkCycle(); /饮料循
11、环void PetCycle(); /宠物循环void SmokeCycle(); /香烟循环void PrintInfo(); /输出结果/-int main(int argc, char *argv)ShowTest(); Init();Calculate();End();system(“PAUSE“);return 0;/-void ShowTest()coutColor = YELLOW;Man1-Color = BLUE;Man2-Color = RED;Man3-Color = GREEN;Man4-Color = WHITE;/Man0-Nationality = NORWEGI
12、AN;Man2-Nationality = BRITISH;/Man2-Drink = MILK;Man3-Drink = COFFEE;/return;/-void End()int i;for(i=0; iNationality = i;Man3-Nationality = j;Man4-Nationality = k;DrinkCycle();return;/-void DrinkCycle()int i=0,j=0,k=0;for(i=0; iDrink = i;Man1-Drink = j;Man4-Drink = k;PetCycle();return;/-void PetCycl
13、e()/对宠物进行排列 组合int i,j,k,l,m;for(i=0; iPet = i;Man1-Pet = j;Man2-Pet = k;Man3-Pet = l;Man4-Pet = m;SmokeCycle();return;/-void SmokeCycle()/对 烟 进行排列 组合int i,j,k,l,m;for(i=0; iSmoke = i;Man1-Smoke = j;Man2-Smoke = k;Man3-Smoke = l;Man4-Smoke = m;if(Check()PrintInfo();return;/-bool Check()/判断是否满 足以下条件if
14、(!Check2() /2、瑞典人养狗return false;else if(!Check3() /3、丹麦人喝茶return false;else if(!Check6() /6、抽 Pall Mall 香烟的人养鸟return false;else if(!Check7() /7、黄色房子主人抽 Dunhill 香烟return false;else if(!Check10() /10、抽 Blends香烟的人住在养猫的人隔壁return false;else if(!Check11() /11、养马的人住抽 Dunhill 香烟的人隔壁return false;else if(!Che
15、ck12() /12、抽 Blue Master的人喝啤酒return false;else if(!Check13() /13、德国人抽 Prince香烟return false;else if(!Check15() /15、抽 Blends香烟的人有一个喝水的邻居return false;elsereturn true;/-bool Check2()/2、瑞典人养狗int i;for(i=0; iNationality = SWEDISH)if(Mani-Pet = DOG)return true;elsereturn false;elsecontinue;coutNationality
16、= DANISH)if(Mani-Drink = TEA)return true;elsereturn false;elsecontinue;coutSmoke = PALLMALL)if(Mani-Pet = BIRD)return true;elsereturn false;elsecontinue;coutColor = YELLOW)if(Mani-Smoke = DUNHILL)return true;elsereturn false;elsecontinue;coutSmoke = BLENDS)if(i=0)if(Man1-Pet = CAT)return true;elsere
17、turn false;if(i=4)if(Man3-Pet = CAT)return true;elsereturn false;else if(Mani-1-Pet = CAT) | (Mani+1-Pet = CAT)return true;elsereturn false;elsecontinue;coutPet = HORSE)if(i=0)if(Man1-Smoke = DUNHILL)return true;elsereturn false;if(i=4)if(Man3-Smoke = DUNHILL)return true;elsereturn false;else if(Man
18、i-1-Smoke = DUNHILL) | (Mani+1-Smoke = DUNHILL)return true;elsereturn false;elsecontinue;coutSmoke = BLUEMASTER)if(Mani-Drink = BEER)return true;elsereturn false;elsecontinue;coutNationality = GERMAN)if(Mani-Smoke = PRINCE)return true;elsereturn false;elsecontinue;coutSmoke = BLENDS)if(i=0)if(Man1-D
19、rink = WATER)return true;elsereturn false;if(i=4)if(Man3-Drink = WATER)return true;elsereturn false;else if(Mani-1-Drink = WATER) | (Mani+1-Drink = WATER)return true;elsereturn false;elsecontinue;coutNationality);coutColor;coutDrink;coutPet;coutSmoke;coutPet = FISH)coutNationality“ 养鱼!“endl;cout“=“endl;return;/-