不考虑从盒子中拿出这一操作,则剩下的部分就是一个Nim游戏。所以先手第一次只要拿到异或和为零的巧克力棒就必胜。因为若对手选择吃巧克力棒,则是必败局面。若选择拿出巧克力,则新的异或和一定不为零,因为如果一组巧克力异或和为零,则先手可以第一次的时候拿出来。
直接dfs就可以。
#include<cstdio>
#include<iostream>
using namespace std;
int n;
int a[20];
bool can;
void dfs(int x,int Xor,int cnt)
{
if(can) return ;
if(x>n)
{
if(Xor==0&&cnt) can=1;
return ;
}
dfs(x+1,Xor^(a[x]),cnt+1);
dfs(x+1,Xor,cnt);
}
int main()
{
int T=10;
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
can=0;dfs(1,0,0);
if(can) puts("NO");
else puts("YES");
}
}