用电脑解决爱因斯坦难题.docVIP

  • 1
  • 0
  • 约7.73千字
  • 约 13页
  • 2017-06-13 发布于广东
  • 举报
用电脑解决爱因斯坦难题

用电脑解决爱因斯坦难题 河南 路明 爱因斯坦在20世纪初出的这个谜语,题目是这样的: 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香烟的人有一个喝水的邻居 据说,98%的人答不出这道题! 这是一道很典型的逻辑推理题,对于此题使用表格方法,通过假设找出矛盾,从而得到正确答案,是比较快速的方法,但即使是这样我见到的最快解出此题的人也用了十几分钟,那么电脑需要多久呢?答案是不到一秒钟! 如果让电脑完全按人类的推理来进行工作,那恐怕代码要写非常长,而且对于以后遇到类似的问题几乎没有什么参考价值。我们可以采用表格法进行递归穷举,利用电脑的强大的计算能力加上一些不复杂的逻辑来实现它,但是对于5!的5次方超过248亿个可能性,计算量相当的惊人。而采用按“国籍”、“饮料”、“色彩”、“香烟”、“宠物”五项信息依次对表格进行可能性填充,一旦不符合逻辑条件则立即中止向后面的信息进行判断,这样就可大大减少运算次数。 我们将使用二维数组InfoArray实现对各信息的初始化,二维数组矩阵Matrix记录表格定义,数组used来存贮与之对应的信息选项是否已用过。AccordWithLogic函数判断是否符合命题逻辑,可以对命题的条件先作一下整理再按信息类别依次来判断,而且输入条件不能涉及到未填充的信息。例如:当前才填充到“饮料”信息就不能去判断涉及到“香烟”的第15个条件,因为还没有向表格中填充任何香烟,那么得出的判断结果是不正确的。FillMatrix函数是程序的主体,它以递归的方式列举了所有的排列可能性。PrintResult函数用于打印结果。 backtracing的设计思想。 Delphi代码实现 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button4: TButton; Label1: TLabel; Label3: TLabel; procedure Button4Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} var Matrix: array[0..4 , 0..4] of smallint; //表格 MatrixRowCount: integer = 4; //表格最大行数 ,即信息数 MatrixColCount: integer = 4; //表格最大列数 ,即每项信息的个数 // 实现对各信息的初始化 InfoArray: array[0..4, 0..4] of string =((挪威人, 英国人, 瑞典人, 丹麦人, 德国人), (茶, 咖啡, 牛奶, 啤酒, 水), (红色, 绿色, 黄色, 蓝色, 白色), (Prince, Pall Mall, Dunhill, Blends, Blue Master), (狗, 鸟, 马, 猫, 鱼)); used: array[0..4 , 0..4] of integer; //与InfoArray对应的元素是否已用过 count_get, count_pro: integer; //结果的个数、共进行了多少次递归运

文档评论(0)

1亿VIP精品文档

相关文档