《可汗学院公开课:脑筋急转弯》简要
一、诚实人与说谎者
问题:
两个箱子,一个有财宝,另一个没有;
有一个诚实人和一个说谎者,他们都知道哪个箱子有财宝;
但你不知道哪个是诚实人哪个是说谎者
如何问他们两人问题,确定哪个箱子有财宝。
答案:
“如果问另一个人,哪个箱子有财宝,对方会怎么回答?”
分析:
可以把问题改为“如果问另一个人,箱子A有财宝是对的吗”
“箱子A有财宝"这是一个断言A。断言A可能为真或假
假如有两个布尔函数F和G,存在2种情况:
1、F(x) = x,G(x) = not x
2、F(x) = not x,G(x) = x
要求用F和G构造一个函数H(x)=x
那么H(x)可以为H(x) = not F(G(x))
二、善变者
问题:
善变者----初始状态随机,可以为诚实人,也可以为说谎者。其每次回答一个问题后,就切换状态,从城市人转换为说谎者,或从说谎者转换为诚实人。
五个人,四个善变者,一个诚实人。
能问两个问题,可以对同一个人问两个问题,或找两个人分别问一个问题。
如何找到诚实人。
答案:
问题一:你是诚实人吗?
问题二:问题一回答“是”(这轮肯定是诚实人) 你们当中谁是诚实人?
问题一回答“不是”(这轮肯定不是诚实人) 你们当中谁不是诚实人?
分析:
问题二的第二个问的问法很有技巧。不过找不到比较合适的“数学”表示法
三、外星人来袭!
问题:
100个人,排队,每人一顶帽子,帽子可能是紫色也可以是绿色。第i个人可以看见前i-1个人的帽子。
从第100个人开始至第1个人报帽子的颜色,如果他报错了,则咔擦掉,如果报对了,则平安。
问用什么样的策略报数,可以使得挂掉的人最少。
答案:
第100个人,如果前99个人紫色帽子的个数是奇数,则报紫色,否则报绿色。
对于1-99中的第i个人
1、他知道前i-1个人的紫色帽子个数是否是奇数;
2、如果第i+1至99报数的人都正确,那么他知道从i+1至99的紫色帽子个数是否是奇数;
3、根据第100个人,他知道前99个人中的帽子个数是否是奇数;
根据前面3个条件,第i个人可以计算出他头上帽子是什么颜色的。
(注意第99个人我们可以认为从i+1至99中没有人,也就是紫色帽子的个数是0,为偶数)
联想:
用布尔运算表示会显得更“准确”点,有点类似一个结构体用一个指针却要表示双向链表的方法。
四、蓝额头房间
问题:
100个逻辑学家参与游戏。
游戏规则:
1、100个逻辑学家蒙眼被带进房间,然后至少一个逻辑学家额头被涂成了蓝色。最后去掉蒙眼布。
2、然后不断的关灯,开灯;在关灯的时候,如果某个逻辑学家推断出他是蓝额头,那么他离开房间。
3、全部蓝额头的人离开房间后,游戏结束。
如果每个人都被涂了蓝额头,会发生什么?
答案:
在第100次关灯的时候,全部人同时离开房间。
分析:
假如只有一个人是蓝额头,那么第一轮他会离开房间;
假如有2个人是蓝额头,那么第一轮没有人离开房间。而这2个人只看到一个蓝额头,那么他会在这一轮离开房间。(他会这样推理,另外那个蓝额头的人除非看到了自己是蓝额头,否则他会在上一轮离开房间)
以此类推。。
扩展:
http://www.newsmth.net/bbscon.php?bid=51&id=155695
一个岛上有100个人,其中有5个红眼睛,95个蓝眼睛。这个岛有三个奇怪的规则。
1. 他们不能照镜子,不能看自己眼睛的颜色。
2. 他们不能告诉别人对方的眼睛是什么颜色。
3. 一旦有人知道了自己是红眼睛,他就必须在当天夜里自杀。
某天,有个旅行者到了这个岛上。由于不知道这里的规矩,所以他在和全岛人一起狂欢
的时候,不留神就说了一句话:"你们这里有红眼睛的人。"
假设这个岛上的人足够聪明,每个人都可以做出缜密的逻辑推理。请问这个岛上将会发
生什么?
陶哲轩说,这个旅行者事实上讲了一句废话,没有带来任何新的信息。因为这岛上有95个蓝眼睛,5个红眼睛。每个人都知道这岛上有红眼睛的人。无非是蓝眼睛的人看到有5个红眼睛,红眼睛的人看到有4个红眼睛而已。旅行者说的那句"岛上有红眼睛的人",没有输入任何新的信息,他说的就是岛上的人每天都看到的景象。所以哪怕岛上的人思维再缜密严谨,也不会有任何自杀的情况发生。
(神和人的区别太明显了。。)
五、占位符
课程上对应的第5节是“蓝额头房间”的分析
六、数字额头游戏
问题:
把3个逻辑学家放进房间里面,在3个逻辑学家头上写上3个不同的数字,其中某个数字是其他两个数字之和。
A看见了B额头上写了20, C额头上写了30
A:我不知道我头上写的是多少?
B:我也不知道
C:我也不知道
A:我知道了
问:A额头上写的是多少?
答案:
A看到20和30=>A知道他头上的数组不是10就是50
1、如果A头上的数是10
B看到10和30=>那么B会知道他头上的数字不是20就是40
C看到10和20=>C会知道他头上的数字不是10就是30;但由于3个数都不相同,那么C会知道他头上的数字就是30,那么C能确定他头上的数字是30
结论:A头上的数字不是10,那么就只会是50
联想:
如果复杂到一定程度,人脑容不下这么复杂状态,怎么写程序解?
七、灯亮or灯灭
问题:
100个灯泡,起始全是灭的。
执行100次步骤:第i次步骤,对i,2*i,3*i 。。的灯全部切换一下开关(灭的开等,亮的关灯)
最后有多少灯是亮的
答案:
对第n个灯,假如他有k个因子,那么他会被切换k次开关;但k为奇数时,这个灯会是亮的。而只有平方数是有奇数个因子,100里面有10个平方数,所以答案为10
八、路径计算
问题:
n*m网格,从(1,1)走到(n,m)有多少种走法?只能向下或向右走一步
答案:
组合数C(n+m-2, n - 1)。
视频里面居然先用二维递推解一遍,然后又用母函数解一遍
分析:
从(1,1)走到(n,m)需要n+m - 2步,其中有n-1步是向下的
联想:
用来了解下递推或母函数也是不错的
九、三维路径计算
问题:
x*y*z正方体,从(1,1)走到(x,y,z)有多少种走法?只能向下或向右走一步
解法:
同上题
联想:
如果是在正方体表面行走,似乎递推方便点,用组合数比较麻烦。