博弈论之尼姆博奕

尼姆博奕 :

  有n堆物品,每堆物品的个数是任意的,双方轮流从中取物品,一次只能从一堆物品中取部分或全部,最少取一件,取到最后一件物品的人获胜。

结论:把每堆物品数全部异或,如果得到的值为0,那么后手必胜,否则先手必胜。

关于尼姆博奕详解的:http://www.cnblogs.com/jiangjun/archive/2012/11/01/2749937.html

code:(HDU-1970)

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int t,n,ai,res,flag;
 9     scanf("%d",&t);
10     while(t--)
11     {
12         res = 0 , flag = 0;
13         scanf("%d",&n);
14         for(int i = 1 ; i <= n ; i++)
15         {
16             scanf("%d",&ai);
17             res ^= ai;
18             if(ai > 1)
19                 flag = 1;
20         }
21         if(flag)
22         {
23             if(res)
24                 printf("John\n");
25             else
26                 printf("Brother\n");
27         }
28         else//每堆物品数都是1,总数为奇数先手先拿完,否则后手先拿完
29         {
30             if(n & 1)
31                 printf("Brother\n");
32             else
33                 printf("John\n");
34         }
35     }
36        return 0;
37 }

 

posted @ 2016-08-20 13:54  jb-simple  阅读(482)  评论(0编辑  收藏  举报