1.12 NIM(2)“拈”游戏分析

1.12 NIM(2)“拈”游戏分析

基础问题:有N块石头和两个玩家A和B,玩家A先将石头分成若干堆,然后按照BABAB的顺序不断轮流取石头,能将剩下的石头一次取光的玩家获胜,每一次取石头,每一个玩家只能从若干堆石头中任选一堆,取这一堆石头中任意数目(大于1)个石头,请问:玩家A要怎样分配和取石头才能保证自己有把握获胜?

解法:

n 表示石头的堆数 , m表示总的石头数目
n = 1 , no
n = 2 , m > 2 ,(1,1)是安全局面 , (1,X)就不是安全局面 , (2,2)是安全局面
初步总结,如果石头的数目是偶数个,就将它平均分成两堆,这样无论对手怎么取,自己取完之后保证安全局面就可以了
那么如果石头的数目是奇数个呢?
m = 3 ,(2,1),(1,1,1) no
看整个游戏过程:
n堆石头,从\((m_1,m_2,m_3,...m_n)\)开始,直到石头全部递减为\((0,0,0...,0)\)

  • 当m是偶数的时候,将m分成相同的两份,这样就能够取胜:
    开始:\((m_1,m_2)\) , 他们的异或结果是\(XOR(m_1,m_2) = 0\)
    中途:\((m_1,m_2)\) ,无论对手怎么取,两堆石头肯定变得不相等 \(XOR(m_1,m_2) != 0\)
    我方:\((m_1,m_2)\) , 将两堆变得相等
    ......
    最后: \((0,0)\) , 我胜
  • 当m是奇数的时候:
    开始:\((m_1,m_2,...,m_n)\) , \(XOR(m_1,m_2,...m_n) = ?\)
    中途:\((m_1,m_2,...,m_n)\) , \(XOR(m_1,m_2,...,m_n) = ?\)
    ......
    最后: \((0,0)\) ,\(XOR(0,0,0,...,0) = 0\)
    事实上:当有奇数个石头的时候,无论怎么分堆\(XOR(m_1,m_2,...m_n) = ?\)的结果不能等于0
    证明:
    当m为奇数的时候(二进制表示最低位为1),异或的结果最低位肯定为1
    更有:还可以证明,当\(XOR(m_1,m_2,...m_n) !=0\)时,我们总可以只改变一个值,就可以让\(XOR(m_1,m_2,...m_n) = 0\)
    还可以证明,\(XOR(m_1,m_2,...m_n) = 0\)时,可以通过修改一个使得\(XOR(m_1,m_2,...m_n) != 0\)
    有了上述的几个证明得之:
    m为奇数的时候,必输

拓展问题:

1 如果规定相反,取光所有石头的人输,又应该如何控制局面?

n代表石头的堆数
m代表石头的总数
\(m_i\)代表第i堆的石头总的数目

  • 如果m是奇数,则和上面的证明一样,必赢
  • 如果m是偶数,将石头分为数目相同的两堆
    \(if m_1 > 1 ,m_2 > 1 , m_1 = m_2\)取到两堆相同
    \(if m_1 = 1,m_2 > 1\),把\(m_2\)取完,反之同理。
    \(if m_1 = 0\),把\(m_2\)取完,反之同理。

2 如果每一次可以挑选任意K堆,并从中任意取石头,又该如何找到必胜策略呢?

待定

上一篇:CodeForces 1006F Xor-Paths|Meet in the middle


下一篇:[CF1446C] Xor Tree