博弈论之尼姆博奕
尼姆博奕 :
有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 }