爱因斯坦的难题
传说下面是爱因斯坦在20世纪初出的一道测试题。他说世界上有99%的人回答不出这道题,
看看你是否属于另外的1%?题目如下:
前提:
1 有五栋五种颜色的房子
2 每一位房子的主人国籍都不同
3 这五个人每人只喝一种饮料,只抽一种牌子的香烟,只养一种宠物
4 没有人有相同的宠物,抽相同牌子的香烟,喝相同的饮料
条件:
1 英国人住在红房子里
2 瑞典人养了一条狗
3 丹麦人喝茶
4 绿房子在白房子左边
5 绿房子主人喝咖啡
6 抽PALL MALL烟的人养了一只鸟
7 黄房子主人抽DUNHILL烟
8 住在中间那间房子的人喝牛奶
9 挪威人住第一间房子
10 抽BLENDS烟的人住在养猫人的旁边
11 养马人住在DUNHILL烟的人旁边
12 抽BLUE MASTER烟的人喝啤酒
13 德国人抽PRINCE烟
14 挪威人住在蓝房子旁边
15 抽BLENDS烟的人的邻居喝矿泉水
问题:谁养鱼?
解法:
利用数组和循环:
用5个数组(数组名)表示5种属性,用1、2、3、4、5分别代替各种属性的具体取值
数组的下标表示房间号,数组元素的取值表示某房间某属性的具体取值的代号
房间号(即数组下标)也表示方位,房间号小的为左,大的为右,下标相邻即房间相邻
房间 0 1 2 3 4
国家 挪 德 瑞 英 丹 ---> a[5]
颜色 绿 蓝 黄 红 白 ---> b[5]
饮品 咖 水 奶 酒 茶 ---> c[5]
香烟 blends prince dunhill blue pall ---> d[5]
宠物 鱼 猫 狗 马 鸟 ---> e[5]
取值 1 2 3 4 5 ---> 数组元素的取值
条件化简:
1 英---红 若a[i]=4,则b[i]=4
2 瑞---狗 若a[i]=3,则e[i]=3
3 丹---茶 若a[i]=5,则c[i]=5
4 绿---在白左面 若b[i]=1,b[j]=5,则i<j
5 绿---咖 若b[i]=1,则c[i]=1
6 鸟---pall 若e[i]=5,则d[i]=5
7 黄---dunhill 若b[i]=3,则d[i]=3
8 中间房子---奶 c[2]=3
9 挪---第1间房 a[0]=1
10 猫---有blends邻居 若e[i]=2,则d[i-1]=1 || d[i+1]=1
11 马---有dunhill邻居 若e[i]=4,则d[i-1]=3 || d[i+1]=3
12 酒---blue 若c[i]=4,则d[i]=4
13 德---prince 若a[i]=2,则d[i]=2
14 挪---有蓝邻居 ==〉b[1]=2
15 水---有blends邻居 若c[i]=2,则d[i-1]=1 || d[i+1]=1
C++源代码:
//爱因斯坦难题
//程序设计:万道濮
//说明:此版本是完美版
#include<iostream.h>
int main()
{
cout<<endl;
cout<<" * 爱因斯坦难题 * \n";
cout<<" 程序设计开发:万道濮\n";
cout<<" [2005.1.15]\n";
cout<<"================================================================================";
int a[5],b[5],c[5],d[5],e[5],t[120][5]; //定义所需数组
int i,j,c1,c2,c3,c4,p1,p2,p3,p4,p5; //定义所需变量
char cmd; //cmd用来暂存用户输入的命令
int k; //k用来计数
cout<<" 传说下面是爱因斯坦在20世纪初出的一道测试题。他说世界上有99%的人回答不出这道题,看看你是否属于另外的1%?题目如下:\n";
cout<<"\n前提:\n";
cout<<" 1 有五栋五种颜色的房子\n";
cout<<" 2 每一位房子的主人国籍都不同\n";
cout<<" 3 这五个人每人只喝一种饮料,只抽一种牌子的香烟,只养一种宠物 \n";
cout<<" 4 没有人有相同的宠物,抽相同牌子的香烟,喝相同的饮料 \n";
cout<<"条件:\n";
cout<<" 1 英国人住在红房子里 \n";