2009年4月24日星期五

How To Solve It,2

Problem:100根火柴,两个人轮流取,每个人每次只能取1~7根,谁拿到最后一根火柴谁赢;问有必胜策略吗,有的话是先手还是后手必胜?
问题很简单,也就是我先前提到的逆向思维的拓展问题之一。
采取递归的思维方式,请先回忆一下汉诺塔问题。
拿到最后一根火柴为胜者,即在对手取最后一轮时,火柴最多只能剩7根,多则溢少则输。
换句话说,必胜策略:胜者取完倒数第二轮后,剩余火柴为8根。此时无论输者取几根都是输。根据100-8=92,可知,胜者必须取到第92根。
呵呵,到这里了,同样应用同种原理,胜者必须取到92-8=84,第84根。
如此,tsutsukeru
92,84,76,……,12,4.
由于4<7,故先手必胜

还有个可用类似思维方式的题,来自《编程之美》
两堆橘子,各为m和n个,两人轮流拿,拿的时候你只能选择某一堆在里面拿(即不能跨堆拿),你可以拿1~这堆里面所有剩下的个橘子,谁拿到最后一个橘子谁赢;问题同上。

How To Solve It,1

譬如《How To Solve It》上面举的例子:通过一个9升水的桶和一个4升水的桶在河里取6升水。这个题目通过正向试错,很快也能发现答案,然而通过反向归约,则能够不偏不倚的命中答案。
如果是正向试错,也就是分析6L的水如何装在这两个桶里,也就是两种结果
9L桶 4L桶
6 0

2 4
再来分析如何装入,这个纯属暴力算法。考虑情况1,也就是9L桶中倒出3L,由于9-3=6,4-3=1,9-1=8,8=2*4;也就可以分析出交换过程了。考虑情况2,这个情况相比第一种要复杂一些,因为结果是不可解,换句话说,(2,4)情况可转化成(6,0)即最终结果仅一种。

如果采用的是逆向推理,比较适应直觉思考。其实在正向推理的过程中我不知不觉用到了逆向推理。呵呵,也就是算式写的顺序,如果是正向的话,应该从8=2*4开始推。

说了这么多,这道题还有许多的拓展问题。其实在思考方式上很像——编程人员最优美也是最头疼的递归算法。

2009年4月23日星期四

it's ironic

Sometimes I think the most real peason I never met.
BUT everyone has their first data. and the object is to hide your flaws.
And then you're in a relationship. and it's all about hiding your disappointment.