《编程之美》1.11节介绍了一个取石头的游戏,游戏规则如下:N个石头排成一行,两个玩家依次取石头,每次可以取一块或者相邻的两块,取到最后一块石头的获胜。如果A方先手,如何保证自己获胜?
书中给出了一个A必胜的方案,如果总共有奇数个石头,A取走中间的一块,如果总共有偶数块石头,A取走中间的两块,这样石头将变成对称的两堆,A只要按照和对手对称的方法选取,最终总是可以取到最后一块石头,从而保证获胜。
书中还给了一个扩展问题:如果取到最后石头的人判输,A应该如何应对?
很容易可以推导出A在1块石头的情况下必输,2、3块时必胜,4时必输,在此基础上可以推导出5、6时必胜(因为A首先取走边上的1块或2块石头就变成了4块,此时B先手必输);于是网上许多文章认为石头总数为3k+1时A必输,其它时候必胜。
其实这个过程是错误的,大部分认为7块石头A必输的推导过程,都是说A取走一块或两块之后变成了5块或6块石头,而这是一个对方先手必胜的局面,这里的推导过程显然忽视了连续性这个问题,A如果不是从边缘而是从中间的某个位置取走一块石头,则剩余石头就变成了非连续的6块石头,前面的结论就未必成立了,因此这里的推导在逻辑上是有漏洞的。
实际上,对于7块石头,存在着A先手必胜的方案,那就是取走中间的一块,这样总的石头就变成了分离的两部分,每边3块,这时B有几种可能的策略:
1) 在任意一堆,取走边上的一块,这时A取走另外一堆边上的一块,变成2*2的两堆;如果B取走其中1块,A取走另外一方的两块,则A胜,如果B取走一方的两块,A取走另外一方的1块,也是A胜;
2) 在任意一堆取走中间的一块,这时A取走另外一堆相邻的两块,剩余三个不连续的石子该B取,A胜;
3) 在任意一堆取走连续的两块,这时A取走另外一堆中间的一块,同样变成剩余三个不连续的石子该B取,还是A胜;
同样的,对于8块石头的情况,A先手取走中间的两块,后面的过程和7块石头相同,也是A必胜。
至于9个以及更多石头的方案,留待后续研究。