题目链接:http://poj.org/problem?id=1704
解题思路:
将两个相邻石子看成一组,每一组中前一个和后一个的距离等效成NIM博弈中石子个数(相邻两组之间距离无影响),这样就实现了到NIM博弈的转化,之后可以用NIM的异或规则进行博弈,需要注意的是石子不一定是偶数堆,如果是奇数堆则直接将第一组设为最左边一个元素,同时设其NIM值为其可移动范围即可。
示例代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1010;
int T, n, a[maxn], s;
int main() {
scanf("%d", &T);
while (T --) {
scanf("%d", &n);
for (int i = 0; i < n; i ++) scanf("%d", a+i);
sort(a, a+n);
s = (n % 2) ? a[0] - 1 : 0;
for (int i = n%2; i < n; i += 2)
s ^= a[i+1] - a[i] - 1;
puts(s ? "Georgia will win" : "Bob will win");
}
return 0;
}