POJ 1704 Georgia and Bob【博弈】

题目链接:

http://poj.org/problem?id=1704

题意:

给定棋子及其在格子上的坐标,两个人轮流选择一个棋子向左移动,每次至少移动一格,但是不可以碰到其他棋子。无路可走的时候视为输。问最后谁赢。

分析:

将棋牌上的棋子两两看成一组,将他们之间的空格看成棋子,这样就可以转化为Nim游戏
右边的棋子向左走相当于从堆中拿走石子,左边的棋子向左走,增加了棋子的数量,但是只要对手将所加的部分减回去又回到了原来的状态,同样可以转化为Nim问题。

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1005;
int p[maxn];
int main (void)
{
    int T;cin>>T;
    while(T--){
        int N;cin>>N;
        int x = 0;
        for(int i = 0; i < N; i++)
            cin>>p[i];
        if(N & 1) p[N++] = 0;
        sort(p, p + N);
        for(int i = 0; i + 1 < N; i += 2){
            x ^= (p[i + 1] - p[i] - 1);
        }
        if(x) cout<<"Georgia will win"<<endl;
        else cout<<"Bob will win"<<endl;
    }
    return 0;
}
posted @ 2016-03-25 12:26  zhuyujiang  阅读(116)  评论(0编辑  收藏  举报