1、三堆火柴分别有18根、19根、20根。甲、乙两人轮流从中取火柴。规则是:每人每次只能从其中的一堆取,最少要取一根,最多可以全部取走,可以任意选择,谁取完最后一堆的最后一根就获胜。如果你先取,要怎样取法才能保证获胜?

分析:当时做这个题目的时候,我还没有学数据结构和算法,在算法这方面还没有什么认识,所以,一上来就是无从下手,这个时候就开始了各种推测,这样取那样拿,最后,发现情况有很多种分析不完,思路一片混乱,所以最后没有做出来。在我学了一段时间算法以后,在今天又把这个题目拿出来看了看,虽然再一次看了一下这个题目,但是,我发现我脑袋里面还是漂浮着以前的想法,感觉还是无从下手。这个时候我就慢慢静下来说,分析算法不能乱猜,肯定都是有规律的,然后,就开始了各种尝试,一会后我就发现了规律,好像题目也就解出来了,下面是我对这个题目的想法。

答:这里有三堆火柴,有点多,不好研究,我就先随便取完任何一堆,这样就剩下2堆火柴,如果对手随便再取走一堆,那么我把剩下的那一堆拿走就赢了,但是对手没有那么傻。如果对手从其中一堆火柴中拿走若干根火柴,那么那一堆火柴还剩下若干根,这个时候,你就在他没取的另外一堆里面取走若干根,但是要保证你取走若干根后,剩下的火柴和他取的那一堆火柴剩下的数目相等,这样,在下一次不管他从哪一堆取走多少根,你就在他没取的那一堆取走和他一样的根数(其实就是保证这两堆火柴一直保持一样的数目)。最后都会变成两堆柴都剩下一根的情况,这个时候,他就只能从一堆里面拿一根,而你拿最后一根,这样就胜利了。

这样讲可能不好理解,所以我通过实际火柴来分析,比如我先拿走18根柴的那一堆,就剩下19根、20根两堆火柴。这个时候不管他全部取走任何一堆都赢了,哈哈哈,不过对手不是傻子。如果他从19根里面取走1到18根,那么就还剩下18到1根,这个时候你就到20根里面取走2-19根,那么还剩下18到1根,这样取的目的就是保证两堆火柴数目一毛一样。到了这里,你会发现,不管对手怎么取,你只要保证两堆火柴数目一样就可以了,这样你就赢了。