大家在网上可以搜索到不少的“爱因斯坦经典逻辑题”方面的帖子。
基本上都是“用语言描述分析”的,也有用代码求解的(我只找到几个C++的)。
当然“原版出处”也许找不到,基本都是翻译成中文的了,内容差异不大。
前几天Q群里有人提起了这问题,也写出了解题代码。
题目内容基本是这样:
这个“提示”严格来说不应该称为提示,应该是“已知条件”或“限制条件”。
若没有“条件”,那么谁都可以养鱼,没有推理依据,这“问题”也不能成为真正的问题。
不过,上面的“第4项”似乎有点歧义,也许是“翻译”不准确的原因。
按我写出来的代码,如果“绿色房子”必须紧挨着白色房子,那么只有1个解;
如果“绿色房子与白色房子可以不紧邻、只要符合‘在其左边’即可”,那么就会有7
组符合要求的解。估计爱因斯坦的“原意”应该是“绿、白紧邻”的。
当然,编程解决嘛,也没有什么好高深的:列举所有的组合、按条件进行判断呗。
符合全部条件的即是“解”;任一条件不符合排除掉就是了。
只不过呢,编程自然就有“代码效率”问题,
若不讲求技巧、方法,那么必然运行速度很慢。
毕竟每个“因素”(房子颜色、国籍、饮品、香烟、宠物)的全排列有120种(5!=120),
5种因素全部的组合,就会有120⁵种,要把这么多种组合“查完”,耗时肯定不少。
当时群里那位的“初始代码”,运行了十几秒求出解,我的“直觉”就感觉太慢了。
当然后来他发布出了优化过的代码,速度就要快得多了。
我运行试了一下,求“唯一解”的情况“通常情况”在100ms左右。
感觉速度还算过得去罢。(我的电脑属于“低配”的)
后来我也按我的想法,写了一份代码。IDE中运行,基本是4ms,编译后基本为2ms。
(注意:我这个时间是“枚举所有可能的情况”,不是找到一个就结束)
我发这个帖子,是想让大家开动脑筋,写代码试试看,看你的代码效果如何。
现在大家主要考虑“绿色房子紧邻着白色房子”这种情况吧,看看你的代码需要
运行多久求出答案。如果“运行时间长”的话(比如30ms以上),用GetTickCount()
就行了,也可以用VB自身的 Timer()函数(此函数单位是“秒”,单精度值)。
时间短的话,就要象下面我的代码中那样,用较高精度的API函数。
我的算法代码,暂时不公布,先只发个“效果图”。
下图另存为rar文件,可以解压出我的exe,可以在你的电脑上实际运行一下。
当然我的“初始代码”就是奔着“最高运行速度”去的,“枚举所有可能”的代码看起来有点乱。
不过最终速度是远比我想象的快多了(我原本以为“求全部解”会要100ms以上)。
过段时间,合适的时候,我会公布整理过后看起来“比较清晰”的代码,
这样当然运行速度就会慢些,求全部解的,IDE中6、7ms,编译后4ms左右。
基本上都是“用语言描述分析”的,也有用代码求解的(我只找到几个C++的)。
当然“原版出处”也许找不到,基本都是翻译成中文的了,内容差异不大。
前几天Q群里有人提起了这问题,也写出了解题代码。
题目内容基本是这样:
这个“提示”严格来说不应该称为提示,应该是“已知条件”或“限制条件”。
若没有“条件”,那么谁都可以养鱼,没有推理依据,这“问题”也不能成为真正的问题。
不过,上面的“第4项”似乎有点歧义,也许是“翻译”不准确的原因。
按我写出来的代码,如果“绿色房子”必须紧挨着白色房子,那么只有1个解;
如果“绿色房子与白色房子可以不紧邻、只要符合‘在其左边’即可”,那么就会有7
组符合要求的解。估计爱因斯坦的“原意”应该是“绿、白紧邻”的。
当然,编程解决嘛,也没有什么好高深的:列举所有的组合、按条件进行判断呗。
符合全部条件的即是“解”;任一条件不符合排除掉就是了。
只不过呢,编程自然就有“代码效率”问题,
若不讲求技巧、方法,那么必然运行速度很慢。
毕竟每个“因素”(房子颜色、国籍、饮品、香烟、宠物)的全排列有120种(5!=120),
5种因素全部的组合,就会有120⁵种,要把这么多种组合“查完”,耗时肯定不少。
当时群里那位的“初始代码”,运行了十几秒求出解,我的“直觉”就感觉太慢了。
当然后来他发布出了优化过的代码,速度就要快得多了。
我运行试了一下,求“唯一解”的情况“通常情况”在100ms左右。
感觉速度还算过得去罢。(我的电脑属于“低配”的)
后来我也按我的想法,写了一份代码。IDE中运行,基本是4ms,编译后基本为2ms。
(注意:我这个时间是“枚举所有可能的情况”,不是找到一个就结束)
我发这个帖子,是想让大家开动脑筋,写代码试试看,看你的代码效果如何。
现在大家主要考虑“绿色房子紧邻着白色房子”这种情况吧,看看你的代码需要
运行多久求出答案。如果“运行时间长”的话(比如30ms以上),用GetTickCount()
就行了,也可以用VB自身的 Timer()函数(此函数单位是“秒”,单精度值)。
时间短的话,就要象下面我的代码中那样,用较高精度的API函数。
我的算法代码,暂时不公布,先只发个“效果图”。
下图另存为rar文件,可以解压出我的exe,可以在你的电脑上实际运行一下。
当然我的“初始代码”就是奔着“最高运行速度”去的,“枚举所有可能”的代码看起来有点乱。
不过最终速度是远比我想象的快多了(我原本以为“求全部解”会要100ms以上)。
过段时间,合适的时候,我会公布整理过后看起来“比较清晰”的代码,
这样当然运行速度就会慢些,求全部解的,IDE中6、7ms,编译后4ms左右。