首页 > 其他 > 详细

博弈论之尼姆博奕

时间:2016-08-20 14:29:42      阅读:208      评论: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
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!