POJ - 1704 Georgia and Bob 阶梯博弈
阶梯博弈:
阶梯博弈:博弈在阶梯上进行,每次可以将一堆的若干式子移动到上一阶去,不可操作者输。
忽略所有的偶数阶梯,只留下奇数阶梯,转化为普通的NimNim游戏。大致的思路是这样的:首先终止状态一定是所有石子都在00号阶梯,即一个偶数阶梯。那么如果对方移动了一个偶数阶梯上的石子,那么你可以在移动结束的那个奇数阶梯,直接把等数量的石子继续向前移动,这样子可以保证偶数阶梯上的石子对于结果没有任何影响。那么如果移动的是一个奇数阶梯,因为偶数阶梯是没有影响的,所以你可以认为移动奇数阶梯就是直接被移走了,那么这就是一个普通的NimNim游戏了。
把每两个相邻棋子之间的距离当作是石子 则变为阶梯博弈。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<set> #include<vector> //睿智OJ头文件 using namespace std; int a[1005]; bool cmp(int a, int b) { return a > b; } int main() { int T; cin >> T; while (T--) { int n; cin >> n; int now = 0; for (int i = 1; i <= n; i++) { cin >> a[i]; } sort(a + 1, a + 1 + n, cmp); a[n + 1] = 0; for (int i = 1; i <= n; i += 2) { now ^= a[i] - a[i + 1] - 1; } puts(!now ? "Bob will win" : "Georgia will win"); } return 0; }