趣味数学编程题解之N-S图详解帽子戏法
IT商界
题目:帽子游戏
大厅内有五个人,已知戴白帽子的说真话,戴红帽子的说假话,请据他们各自提出的线索辨别谁戴白帽子,谁戴红帽子。
甲:我看见一个戴白帽子的;
乙:我没看见一个戴红帽子的;
丙:我看见一个戴白帽子的;
丁:我没看见一个戴白帽子的;
戊:我的话和丙一样。
如何将上面的智力测验用程序编出呢?下面,我们就通过N-S图来解决这个问题。
用N-S图分析问题
1.将问题分成三大部分,分析输入和输出
总共就只有三块,输入、输出和处理。我们可以将五个人用一数组Cap(1)~Cap(5)来表示,将cap()设成两个值,T代表红帽,F代表白帽。这样,我们只要输出Cap(1)~Cap(5)的值就行了。输出呢?我们用N-S图就可表示成图1。暂且如此。
2.处理过程分析
(1)我们知道处理过程无非三种可能:顺序、分支或循环。我们组合一下,可能戴帽的情况有2×2×2×2×2=32种,如果我们一种一种地进行比较,恐怕那样子出来的一个顺序关系的程序也够吓人的,所以应该使用循环。用五个循环(如图2)。
(2)循环整体中通过两个步骤,2.1给Cap(1)~Cap(5)赋值和2.2选择符合条件的方案,淘汰不符合条件的方案,并将符合条件的方案输出。
(3)我们面前要处理的焦点问题对方案按五句话进行选择,如果全部符合,说明该方案是正确的,如果有一句有问题,说明方案不正确(如图4)。为了让我们的程序结构上更加清晰,我们可以将该部分独立组成一个子程序并为之命名JudgCap()。
(4)因为Cap(1)对应着甲的帽子颜色,根据颜色可能出现两种结果,甲的话正确,甲的话不正确,所以我们可以画出如图5的N-S图来表示。
这里面包含了下面两重意思:
<1>甲的话可能正确也可能错误,并且这种可能和甲的帽子颜色密切相关,红帽子说明话正确,白帽子说明错误。
<2>正确时证明其他四人只有一人戴白帽子时是符合要求的,不正确时说明“其他四人中出现一个人戴白帽子的情况”时是不符合要求的。
(5)怎样将这两重意思描述出来呢?
我们首先据甲的帽子颜色判断应该选择<2>中的一种意思进行表达(如图6),这要用到数组Cap(),在甲戴白帽子时,即Cap(1)=False时,应该表达其他四人只有一人戴帽子这种情况才是符合要求的,如果通过,可继续向下判断乙的话,否则,就立时证明该方案是行不通的,我们应立即退出子程序。
(6)我们通过一个标志变量k来记录可查找的戴白帽子的人数,当甲戴白帽子时,即Cap(1)=False成立时,在Cap(2)~Cap(5)中进行寻找,如果四次查找完了时k=1,证明通过甲这一关了,如果k<>1则证明没有通过甲这一关,也即说明该方案是不正确的(如图7);当甲戴红帽子时,即Cap(1)=False不成立时,通过查找,情况和上面正相反。
(7)乙的话的处理和甲大体相似,只不过计数帽子颜色成为了T(红色),计数的大小为0,因为没看见,没看见也即没有(如图7)。其他三句话的处理和上面两句差不多。只要这五句话的关都通过了,就证明该方案是正确的,将它输出就行了(如图8)。
图9列出了程序的总体结构。
语言、界面、源程序
1.语言
程序中通过Virual BASIC6.0语言来实现。
2.界面
我们建立一标准EXE工程,在窗体上放置一个文本框(TxtBox)控件,并将它命名为TxtList,将它作为输出的容器。我们编程进行输出时要考虑该控件的特点,输出应和TxtList密切相关,将其MultiLine属性设为T,以预备输出多种方案。在窗体上放置两个命令按钮(CommandButton),并将其名字改为CmdList,通过此按钮来控制程序执行,另一按钮命名为CmdExit,方便退出程序,并在文本框上方放置一标签,将其caption设为“帽子情况如下:”。
3.源程序
下载地址:http://www.cpcw.com/download/soft/32/c13.txt
小 结
一共三组值:
甲乙丙丁戊
12白红白红红
15白红红红白
27红红白红白
规律找出来了,图画出来了,程序也就编出来了。
数组的另一种秒用也在此间出现,数组也可来代表颜色,也可用来做标志,这样,规律就出来了。








