趣味数学编程题解之五色石
IT商界
下面是一道非常有意思的逻辑推理题,即使不用电脑,也是会让人抓一阵头皮的非常有意思的题目。
题目:五色石
阿拉丙从三光门逃脱之后,在森林里走了三天三夜,终于发现他迷路了。这时他发现五个彩色的大石头,各引一条小路,他不知道选择哪一条路,于是决定先坐下来休息。到了正午,阳光从森林的缝隙照到大石头上,阿拉丙惊觉发现,照在中间大石头上面的光彷佛写着字:
“这是表里不一的五色石。每个石头的外表是虚幻的,其内在的颜色其实与外表的颜色不同。你必须排出正确的顺序,并走有红色内在颜色的石头所引领的路,才能回到你的世界。”
在四个石头上,则各有一个提示:
红石:紫内石旁的石头是蓝外石。
蓝石:绿内石与紫内石之间隔了一个石头。
绿石:这是表里不一的五色石。每个石头的外表都是虚幻的,其内在的颜色其实与外表的颜色不同。你必须排出正确的内石顺序,并走红色内石所引领的路,才能回到你的世界。
紫石:红内石与蓝内石不相邻。
黄石:黄内石位于左边第二个位置。
阿拉丙要再次借着你的智慧逃离此处,你应该选择?
题目分析
这个具有神奇色彩的故事背后,其实就是一个颜色的辩证关系问题。颜色有两种,外表是一种,内里是一种。要进行判断,我们首先需要看一下方案的可能情况,这是一个不算难的排列组合问题:
在五个位置放五种颜色,并使它们各不相同。
算一下大约有5×4×3×2×1=120种方案。
这么多方案中哪一种方案才是我们需要的、符合题目要求的呢?
要找出符合要求的,必须全部符合上面的五个提示。所以只要针对每一种方案按照上面的五个条件来判断,就能找出符合条件的方案。
编程分析
我们最好的解决办法自然就是循环,通过循环来使120种方案遍历一遍,对于每种方案,要通过五个条件判断,所以有两个问题:
(1)如何塑造循环
利用数组,设置一个数组Color(1~5)来代表五种颜色,其顺序为红蓝绿紫黄。这样,将来就可以直接利用数字来代表颜色了,1~5和“红、蓝、绿、紫、黄”一一对应。
再设一数组inside(),并将它设为数值型,以表示可能的内石颜色。将来我们只要将五种颜色作为五个数字来循环出所有的方案并将方案放在该数组中就可以了。
有了上面的数组,我们就可以来执行循环了。
循环时要严格按照各不相同的原则来完成。inside(1)可取1~5之间的任何值,inside(2)可取和前面的inside(1)不同的四个值,其他的依此类推。
(2)判断的条件
因为判断要经常使用,为了使程序表面看起来比较简洁,可单独将它做成一个子程序。在程序中我们自定义了一个函数judge()。
五个条件也就是外石上的五句话。
条件1.红石:紫内石旁的石头是蓝外石。
因为蓝外石在第二个位置,这句话也就告诉我们紫内石在1或3的位置上,如果不是,就不正确了,必须退出程序。
用程序来描述就是:
if inside(1)=4 or inside(3)=4 then
else
exit sub
end if
条件2、4、5和条件1类似。
条件3可分成三部分,第一部分已在上面的循环中实现,即石头的颜色各不相同,还有一个条件是外石的颜色和内石的颜色不同。这一部分的制作同条件1,详细解法请看源程序。
语言、界面、源程序
(1)语言
程序通过Virual BASIC6.0语言来实现。
(2)界面
界面非常简单,建立一标准EXE工程,其caption设为“五色石”,并加入两个命令按钮cmdsearch和cmdexit,caption改为“查找”和“退出”,再在其中加入一个文本框,用来输出结果,其名称为txtlist,多行属性multiline设为true,一切OK。我们将代码加给cmdsearch_Click()即查找按钮的单击事件,将来运行时,我们只要用鼠标单击一下按钮,程序就执行了。
(3)源程序
(下载地址:http://www.cpcw.com/download/soft/34/34-c13-2dm.txt)
编程小结
只有一组符合条件,内石颜色如下:蓝黄紫红绿,红色的位置不言自明了。
数组是个很有用的东东,有了它,许多和数学不沾边的东东,也能利用数学上数字特有的内在特质来解决。