转:http://blog.csdn.net/lttree/article/details/24874819
近期在看博弈系列,搞完了巴什博弈、威佐夫博弈,接下来就是这个尼姆博弈。
这一系列博弈类型可以概括为:
巴什博弈:从一堆石子中拿石子,一次拿1~m个。
威佐夫博弈:从两堆石子中拿石子,方法①任选一堆石子拿k个石子(k≥1),方法②从两堆石子中拿相同数量的石子(当然所拿的数要≥1)
尼姆博弈:从三堆石子中拿石子,每次任选一堆拿任意数目(≥1)的石子。
这些当然是谁先那光,谁获胜。
尼姆博弈解法,和二进制有关。
反正我不知道他们怎么推得,只会用。o(╯□╰)o。。。
给出的数 用异或加起来,若等于0,则为奇异态(必胜态)。
这道题有些不一样,如果John吃的是某个盒子最后一颗,那就判定John为败。
所以,这道题分为两种情况讨论:
①若所有堆的数量都为1。则根据奇偶来判断谁胜。
②其他情况,将所有数据异或起来,判断是否为奇异态。
#include<iostream>
using namespace std;
int main()
{
// freopen("E:\\ACM\\test.txt","r",stdin);
int T,N,x;
cin>>T;
while(T--)
{
cin>>N;
int ans=0;
int flag=1; //判断是否全是1的情况
for(int i=0;i<N;i++)
{
cin>>x;
if(x!=1) flag=0;
ans^=x;
}
if(flag)
N&1?puts("Brother"):puts("John"); // 如果全是1,按照奇偶判断谁获胜
else
ans==0?puts("Brother"):puts("John"); //其他情况,将所有数据异或起来
}
return 0;
}