• Nim博弈游戏


    给定n堆石子,每次每人能从一堆石子中取若干个石子(不能不取),最后不能取石子者败

    对于这个游戏,我们要判断的是,给定局势下,先手者胜还是败

    设先手胜的局势为N-postion,先手败的局势为P-postion

    可以移动到P-postion的局势叫做N-postion,只能移动到N-postion的局势叫做P-postion。

    1、只有一堆的情况下先手胜

    2、只有两堆

      a、数目相等的局势,先手败,因为不管先手怎么取,后手都能在另一堆中复制先手的取法

      b、数目不相等的局势,先手胜,先手可以在石子多的那一堆取走一定的石子,使得两堆的石子数相等,然后参考情况a分析,可知先手胜

    3、两堆以上的情况。将局势分为两个子局势x,y

      那么来分析一下局势的加法与异或之间的关系,

      将局势分为两个子局势n和m,如果两个子局势相同,则表示n==m,将局势如果可以先手胜利,成为n胜或m胜

      局势异或等于0,表示先手败,不等于0,表示先手胜

      若n胜m胜 如果n==m ,n^m==0, 如果n!=m, n^m!=0 ,说明该情况下的局势加法满足异或

      若n胜m负 先手者在n局势先手获得胜利,然后使得后手者在m局势先手,获得失败,所以先手胜  n!=0,m==0, n^m!=0,说明该情况下的局势加法满足异或

      若n负m胜 同上

      若n负m负 先手者在n局势取得失败,然后又在m局势先手取得使得,所以最终失败。   n==0,m==0,n^m==0, 说明该情况下的局势加法满足异或

    所以Nim游戏的判断是否先手胜就变成了判断n堆石子的异或是否不等于0

    那么怎么获得必胜策略是怎么走的呢?即将某堆得石子取走k个,使得的石子异或等于0

    设有n堆石子,a1,a2,...ai...an

    对于ai,取得另外n-1堆得石子的异或s  

    如果 ai > s   ,  那么k= ai - s,  这样子 (ai-k)==s  即 ai^s==0

  • 相关阅读:
    Xamarin.Forms Layout Challenges – Social Network App(转载)
    Erlang gen_server:start_link/3 和gen_server:start_link/4
    Erlang 从URL中截取尾部文件名
    Erlang 聊天室程序(三) 数据交换格式json的decode
    SOCKS5协议
    Erlang 聊天室程序( 一)
    Erlang 聊天室程序(八) 主题房间supervisor 的使用
    Erlang 聊天室程序(四) 数据交换格式json的encode
    Erlide 的安装使用
    日志系统引起的争论
  • 原文地址:https://www.cnblogs.com/justPassBy/p/4366524.html
Copyright © 2020-2023  润新知