关于nim与取火柴问题

    此问题最初是从小外甥的课外题上看到的 ,原题目类似于: 

          一堆火柴有N根,A、B两人轮流取出。每人每次可以取1 根或2 根,最先没有火柴可取的人为败方,另一方为胜方。如果先取者有必胜策略则记为1,先取者没有必胜策略记为0。
当N 分别为100,200,300,400,500 时,先取者有无必胜策略的标记顺序为(回答应为一个由0 和/或1 组成
的字符串)。
    

      小外甥的原题是  :  甲跟乙每次取1到3根火柴,一共有20跟,如果乙取到了最后一根,那么甲就获胜了,怎样才能做到甲获胜呢?  

      根据  https://blog.csdn.net/leonsc/article/details/6331226  这篇博客介绍,里面当中有个公式   :

              若n % ( m + 1 ) == 1则先取必败,否则必胜 (规定:最先没有火柴可取的人为败方)!    也就是说我们拿4个当成一组, 20%4正好等于0,那么,我们要留下一个1给乙才行,

     (20-1)%(3+1) = 3 ,所以,可以得到的结果就是 甲先拿 3个火柴,然后 不管乙拿 1根或者2根或者3根,甲再每次都拿(4-乙)个即可,最后就剩下一个1留给最后的乙了,这样

     甲就胜出了。

          关于这里的公式解析可以从 引用的博客看到: 

很简单可以证明当火柴数为1时先取必败,然后火柴数为m + 1时,无论先取的人怎样取,假定取x个,那么第二个人取m - x个,即可只剩一个留给对方。这样一直下来,如果用D( x ) = 1表示当留有x个火柴时先取必败,那么
D( 1 ) = 1
D( m + 2 ) = 1
D( 2m + 3 ) = 1
........
在这道题的情况就是
D( 1 ) = 1
D( 4 ) = 1
D( 7 ) = 1
.........
所以刚开始这些情况是必败的,换言之,如果刚开始不是这种情况,则先取的人可以取n % ( m + 1 ) - 1个(注意n % ( m + 1 ) == 0的情况,这是应该是取m个),就可以转化成上述令对手必败的情况。

      更多解释请看博客 :  https://blog.csdn.net/leonsc/article/details/6331226  。 

posted @ 2018-10-30 10:01  白云是世界的公民  阅读(395)  评论(0)    收藏  举报