一、尼姆博弈:
有任意堆物品,每堆物品的个数是任意的,双方轮流从中取出物品,
每次只能从一堆物品中取出部分或全部物品,最少取一件,取到最后一件物品的人获胜。
把每堆物品全部异或起来,如果最终得到的值为0,则先手必败,否则先手必胜。
int flag=0;
二、anti-nim:
取到最后一件物品的人输。
先手胜当且仅当:
所有堆石子数都为1且游戏的异或值为0(即有偶数个独单堆(每堆只有一个石子))。
存在某堆石子数不为1,且游戏的异或值不为0.
例题:P2197 【模板】nim游戏
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<vector>
#define ll long long
using namespace std;
int main(void)
{
int t;
scanf("%d",&t);
while(t--)
{
int n,x,ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&x),ans^=x;
if(ans) printf("Yes\n");
else printf("No\n");
}
return 0;
}