题目大意:输入一个整数t,表示测试用例数。接下来,输入一个整数n,表示火柴堆数。在接下来的一行中有n个数字表示每堆火柴的火柴根数
解题思路:简单博弈
1)题目1:今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,
可将一堆全取走,但不可不取,最后取完者为胜,求必胜的方法。
题目2:今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,
可将一堆全取走,但不可不取,最后取完者为负,求必胜的方法。
很明显,本体是第二类的火柴题目
代码如下:
/*
* 1907_2.cpp
*
* Created on: 2013年9月1日
* Author: Administrator
*/
#include <iostream>
using namespace std;
int main() {
/**
* 充裕堆: 火柴根数 > 1
* 孤单堆: 火柴根数 = 1
*/
int sum1; //充裕堆的个数
int sum2; //孤单堆的个数
int ans; //异或.(用来判断是否是奇异局势)
int t;
scanf("%d", &t);
while (t--) {
sum1 = 0;
sum2 = 0;
ans = 0;
int n;
scanf("%d", &n);
//a[i] :表示第i堆的火柴数目
int a[n];
int i;
for (i = 0; i < n; ++i) {
scanf("%d", &a[i]);
if (a[i] >= 2) {
sum1++;
} else {
sum2++;
}
ans ^= a[i];
}
/**
* 如果ans != 0 && sum1 != 0 || ans == 0 && sum1 == 0,
* 那么,John赢
*/
if ((ans != 0 && sum1 != 0) || (ans == 0 && sum1 == 0)) {
printf("John\n");
} else {
printf("Brother\n");
}
}
}