用电脑解决爱因斯坦难题

用电脑解决爱因斯坦难题

ID:9968136

大小:49.00 KB

页数:12页

时间:2018-05-17

用电脑解决爱因斯坦难题_第1页
用电脑解决爱因斯坦难题_第2页
用电脑解决爱因斯坦难题_第3页
用电脑解决爱因斯坦难题_第4页
用电脑解决爱因斯坦难题_第5页
资源描述:

《用电脑解决爱因斯坦难题》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、用电脑解决爱因斯坦难题河南路明一、问题的提出爱因斯坦在20世纪初出的这个谜语,题目是这样的:1、在一条街上,有5座房子,喷了5种颜色。2、每个房里住着不同国籍的人。3、每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物。提示:1、英国人住红色房子2、瑞典人养狗3、丹麦人喝茶4、绿色房子在白色房子左面5、绿色房子主人喝咖啡6、抽PallMall香烟的人养鸟7、黄色房子主人抽Dunhill香烟8、住在中间房子的人喝牛奶9、挪威人住第一间房10、抽Blends香烟的人住在养猫的人隔壁11、养马的人住在抽Dunhill香烟的人隔

2、壁12、抽BlueMaster的人喝啤酒13、德国人抽Prince香烟14、挪威人住蓝色房子隔壁15、抽Blends香烟的人有一个喝水的邻居问题是:谁养鱼?据说,98%的人答不出这道题!二、分析这是一道很典型的逻辑推理题,对于此题使用表格方法,通过假设找出矛盾,从而得到正确答案,是比较快速的方法,但即使是这样我见到的最快解出此题的人也用了十几分钟,那么电脑需要多久呢?答案是不到一秒钟!如果让电脑完全按人类的推理来进行工作,那恐怕代码要写非常长,而且对于以后遇到类似的问题几乎没有什么参考价值。我们可以采用表格法进行递归穷举

3、,利用电脑的强大的计算能力加上一些不复杂的逻辑来实现它,但是对于5!的5次方超过248亿个可能性,计算量相当的惊人。而采用按“国籍”、“饮料”、“色彩”、“香烟”、“宠物”五项信息依次对表格进行可能性填充,一旦不符合逻辑条件则立即中止向后面的信息进行判断,这样就可大大减少运算次数。三、设计我们将使用二维数组InfoArray实现对各信息的初始化,二维数组矩阵Matrix记录表格定义,数组used来存贮与之对应的信息选项是否已用过。AccordWithLogic函数判断是否符合命题逻辑,可以对命题的条件先作一下整理再按信息

4、类别依次来判断,而且输入条件不能涉及到未填充的信息。例如:当前才填充到“饮料”信息就不能去判断涉及到“香烟”的第15个条件,因为还没有向表格中填充任何香烟,那么得出的判断结果是不正确的。FillMatrix函数是程序的主体,它以递归的方式列举了所有的排列可能性。PrintResult函数用于打印结果。整个代码是一个大循环,使用了backtracing的设计思想。四、Delphi代码实现unitUnit1;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Gra

5、phics,Controls,Forms,Dialogs,StdCtrls;typeTForm1=class(TForm)Memo1:TMemo;Button4:TButton;Label1:TLabel;Label3:TLabel;procedureButton4Click(Sender:TObject);private{Privatedeclarations}public{Publicdeclarations}end;varForm1:TForm1;implementation{$R*.dfm}varMatrix:a

6、rray[0..4,0..4]ofsmallint;//表格MatrixRowCount:integer=4;//表格最大行数,即信息数MatrixColCount:integer=4;//表格最大列数,即每项信息的个数//实现对各信息的初始化InfoArray:array[0..4,0..4]ofstring=(('挪威人','英国人','瑞典人','丹麦人','德国人'),('茶','咖啡','牛奶','啤酒','水'),('红色','绿色','黄色','蓝色','白色'),('Prince','PallMall',

7、'Dunhill','Blends','BlueMaster'),('狗','鸟','马','猫','鱼'));used:array[0..4,0..4]ofinteger;//与InfoArray对应的元素是否已用过count_get,count_pro:integer;//结果的个数、共进行了多少次递归运算//取得信息号和项目序号所对应的值并和给定值进行对比functionCompareItem(InfoID,ItemIndex:Integer;CompareText:string):Boolean;beginif(

8、ItemIndex<=MatrixColCount)and(ItemIndex>=0)thenResult:=InfoArray[InfoID,Matrix[InfoID,ItemIndex]]=CompareTextelseResult:=False;end;//采用按'国籍'、'饮料'、'色彩'、'香烟'、'宠物

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。