• 第1章 游戏之乐——NIM(1)一排石子的游戏


    NIM(1)一排石子的游戏

    转载:编程之美-MIN(1)一排石头的游戏

    1. 原题

    1.1 题目

          N块石头排成一行,每块石头有各自固定的位置。两个玩家依次取石头,每个玩家每次可以取其中任意一块石头,或者相邻的两块石头,石头在游戏过程中不能移位(即编号不会改变),最后能将剩下的石头一次取光的玩家获胜。这个游戏有必胜策略吗?

    1.2 解答

          已知:石头数量为N,假设两个玩家分别为玩家A和玩家B,且玩家A先取石头。

          当N<=2时,玩家A可以直接取完所有的石头,玩家A有必胜策略。

          当N=3时,玩家A先取中间的1个石头,剩下的两个石头,玩家B只能取其中的1个,最后1个由玩家A取得,玩家A有必胜策略。

          当N=4时,玩家A先取中间的2个石头,这会又剩下2个石头,玩家B还是只能取其中1个,最后一个由玩家A取得,玩家A有必胜策略。

          当N>4,且N为奇数时,玩家A取中间的1个石头,剩下的左边石头情况和右边石头情况一样,那么无论玩家B如何取石头,玩家A只要

    在相反的方向取相同数量的石头即可,如此下去,最后必然玩家A取得最后的石头,A有必胜策略。

          根据上面的归纳,先手的玩家只有把中间的石头拿走,如果N是奇数,就拿走中间的1个石头,如果N是偶数,就拿走中间的2个石头,

    这样留给玩家B一个对称的局面,接着,无论玩家B怎么拿石头,玩家A都保证对称局面不变,这样,最后肯定是A取得最后的石头。   


    2. 扩展1

    2.1 题目

          若规定最后取光石头的人输,又该如何应对?

    2.2 解答

          N=1时,A必须取得这唯一的也是最后的一个石头,A必然输掉,这是必然结果,无需策略。

          N=2时,A取一个石头,那么B必然取得剩下的一个石头,A有必胜策略。

          N=3时,A取两个石头,那么B必然取得剩下的一个石头,A有必胜策略。

          N=4时,若A取两个石头,那么B取一个石头,A只能取最后剩下的一个石头。

                       若A取一个石头,那么B取两个石头,A只能取最后剩下的一个石头。

                       因此,无论A怎么取,B都有必胜策略。

          N=5时,A只需取边上的一个石头,这样就转化为N=4,B先取了,这样根据上面的分析,可知N=4时,后取的有必胜策略,

                       因此,A有必胜策略。

          N=6时,A只需取边上的两个石头,这样就转化为N=4,B先取了,这样根据上面的分析,可知N=4时,后取的有必胜策略,

                       因此,A有必胜策略。

          从上面可以看出,从3开始A的胜负交替出现,以后的每个问题都可以转化为上一个的子问题,因此N>=3时当N为奇数时A有必胜策略,当N为偶数时B有必胜策略。

          感觉这个扩展中比较麻烦的地方在于“一排石子”,而且N很大的情况下,如果一步一步A和B分别取石子后,最后得到的石子之间可能不是连续的,这样结果就不确定了。比如:最后还有3个连续的石子,A先取,A有必胜策略;最后还有3个都不连续的石子,A先取,A肯定失败。所以呢,最后剩余的石头状态很重要,现在我只是分析到这里,也没看到网上谁很好的解决了这个问题。

    3. 扩展2

    3.1 题目

        若两个人轮流取一堆石头,每人每次最少取1块石头,最多取K块石头,最后取光石头的人赢得此游戏。

    3.2 解答

    1)极端情况:K>=N

       玩家A可以直接取掉所有石头,获得胜利。

    2) 一般情况:K<N

       这里面有个规律,就是,无论一个玩家拿了多少个石头,另一个玩家都能够选择相应的石头数量,使得两个玩家一起拿K+1个石头。

       从上面这个思路,我们考虑N与K+1之间的数值关系:

       N = (K+1) * c + d,其中c>=1,d>=0

       当d!=0时,玩家A先取d个石头,这样还剩(K+1)*c个石头。然后轮到玩家B取石头,不管玩家B取了多少个石头,玩家A都再取相应

    的石头,使得玩家A和玩家B一起取(K+1)个石头,这样,还剩(K+1)*(c-1)个石头,如此往复,最后,肯定A取完石头。

      举例说明:

      剩余石头数目         取石头

      (K+1) * c + d          A取d个

      (K+1) * c          B取X个,A取(K+1-X)个

      (K+1) * (c-1)     ...

       K+1                      B取X个A取(K+1-X)个

       0

       当d=0时,无论A取多少个石头,B取相应的石头,使得A和B一起取(K+1)个石头,这样最后取到石头的肯定是玩家B。

      举例说明:

      剩余石头数目        取石头

      (K+1) * c               A取X个,B取(K+1-X)个

      (K+1) * (c-1)         ...

       ...                         ...

       K+1                      A取X个,B取(K+1-X)个

       0

       即N%(K+1)==0时,玩家B有必胜策略,N%(K+1)!=0时,玩家A有必胜策略。

       可以看出来,如果K很大的话,而N的数值是随机的话,先手的优势是很明显的。

  • 相关阅读:
    算法提高 11-2删除重复元素
    Codeforces 402 D Upgrading Array
    Codeforces 351B Jeff and Furik
    湖南多校对抗赛(2015.03.28) I Inversion Sequence
    湖南多校对抗赛(2015.03.28) H SG Value
    湖南多校对抗赛(2015.03.28) G Good subsequence
    湖南多校对抗赛(2015.03.28) E Longest Increasing Subsequence Again
    湖南多校对抗赛(2015.03.28) B Design road
    湖南多校对抗赛(2015.03.28) A Rectangle
    Codeforces 515D Drazil and Tiles
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4608419.html
Copyright © 2020-2023  润新知