Nim博弈

Nim博弈变形


题意A,B二人玩游戏
游戏描述如下
一共有n堆石头,两人依次从n堆石头中 的某一堆中取一定量的石头
(石头的个数>=1 ,<=m  m为每一堆的最大允许取出来的数量)
假设A先开始取然后再B,请判断A是Win 还是Lose

NIM博弈讲解 http://www.cnblogs.com/exponent/articles/2141477.html

通常的Nim游戏的定义是这样的:有若干堆石子,每堆石子的数量都是有限的,
合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,
则判负(因为他此刻没有任何合法的移动)。    
对于一个Nim游戏的局面(a1,a2,...,an),它是P-position当且仅当a1^a2^...^an=0,其中^表示异或(xor)运算。


#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<set>
#include<cstring>
#include<map>
#include<queue>
using namespace std;
int main()
{
    long long ans,n,m;
    int N;
    while(~scanf("%d",&N))
    {
        for(int i=1;i<=N;i++)
        {
            scanf("%lld%lld",&n,&m);
            if(i==1)
                ans=n%(m+1);    ///n%(m+1)对应着每一堆会出现的最优结果
            else
                ans^=n%(m+1);   ///判断每一个二进制位上是否为0,即是否存在偶数个1
        }
        if(ans)
            printf("Win\n");
        else
            printf("Lose\n");
    }
    return 0;
}


你可能感兴趣的:(Nim博弈)