C语言编程快速解决爱因斯坦谜题
2012年7月15日
1 问题简介
爱因斯坦谜题(Einstein'sriddle)是很多人熟悉的问题。记得读高中时候就有同学就拿这个题目来考人,不过那时的解法主要是数学推理和逻辑判断,现在学习了编程技术后,自己再尝试使用计算机来协助解决这个问题,又是另一种不同的感受。
--------------------------------------------------------------------------------------------------------------------------------------
源码链接:https://einsteinriddle.googlecode.com/files/EinsteinRiddle.rar
SVN检出:svn checkout http://einsteinriddle.googlecode.com/svn/trunk/ einsteinriddle-read-only
-------------------------------------------------------------------------------------------------------------------------------------
1.1 谜题内容
爱因斯坦在20世纪初出的这个谜语。他说世界上有98%的人答不出来。
1、在一条街上,有5座房子,喷了5种颜色。
2、每个房里住着不同国籍的人
3、每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物
问题是:谁养鱼?
已知条件:
1、英国人住红色房子
2、瑞典人养狗
3、丹麦人喝茶
4、绿色房子在白色房子左面(紧邻的左边)
5、绿色房子主人喝咖啡
6、抽Pall Mall 香烟的人养鸟
7、黄色房子主人抽Dunhill香烟
8、住在中间房子的人喝牛奶
9、 挪威人住第一间房
10、抽Blends香烟的人住在养猫的人隔壁
11、养马的人住抽Dunhill香烟的人隔壁
12、抽Blue Master的人喝啤酒
13、德国人抽Prince香烟
14、挪威人住蓝色房子隔壁
15、抽Blends香烟的人有一个喝水的邻居
以上是爱因斯坦在20世纪初出的这个谜语。他说世界上有98%的人答不出来
1.2 数学推理思路
这里顺便讲解一下运用数学推理解决此问题的方法,已经了解过的人可以跳过此部分,直接关注编程解决章节。
基本解决思路(类似数独游戏的填充过程):
1) 可以绘制一份5X5的表格来表示这25种属性。
2) 根据条件8、条件9、条件14可以确定出三个格子的内容。
属性 |
房子1 |
房子2 |
房子3 |
房子4 |
房子5 |
颜色 |
蓝色 |
||||
国籍 |
挪威 |
||||
饮料 |
牛奶 |
||||
香烟 |
|||||
宠物 |
3) 根据条件5,绿色房子的主人喜欢喝咖啡,断定该条件只能使用房子1、4、5;根据条件4,绿色的房子在白色的房子紧邻的左边,那么可以推断出房子5是白色、 4是绿色;而红色房子住的英国人,该条件只能满足房子3;剩下的房子1必然是黄色的,而根据条件7黄色房子主人抽Dunhill香烟,可确定起香烟属性。
如图所示:
属性 |
房子1 |
房子2 |
房子3 |