码迷,mamicode.com
首页 > 其他好文 > 详细

博弈论之尼姆博奕

时间:2016-08-20 14:31:08      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

尼姆博奕 :

  有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 }

 

博弈论之尼姆博奕

标签:

原文地址:http://www.cnblogs.com/x-1204729564/p/5790298.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!