您的位置:首页 > 其它

POJ 1704 Georgia and Bob题解

2016-01-18 18:02 281 查看
【题目大意】:

   一个很长的格子列上有N 个棋子,开始位置一定,两人轮流操作(Georgia先手),每次移动一枚棋子,要求只能向左移且至少移动一格,而且不能越过任何棋子,最后谁无法移动棋子谁就输。

【分析】:

   我们考虑从后往前将棋子两两配对(若N为奇数则想象有一个棋子放在第0号位置,将第一个棋子与其配对即可)。这样我们考虑:游戏的最终目的是将任意两棋间间距变为0。若先手移动了某对棋子中的前一个,那么后手也可以移动该对棋子中的后一个相同步数(由于先手可移动,那么根据规则,后者也可移动相同步数),这样一来,两对棋子的间距就不成问题了,即不影响棋局(因为可等价于先手将某对棋子的第一个移到前一对棋子的第二个的后面,而后手则可将该对棋子的后一个移动相同步数而不影响胜负,这样一来,棋子间距就只剩下每对棋子中的间距了),因而每对棋子中的间距相当于Nim游戏中的石子个数,那么原题的SG函数就是每对棋子间距的亦或和了。

【代码】:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 1001
int DATA,N,a[MAX];
int main()
{
scanf("%d",&DATA);
for(int data=1;data<=DATA;data++)
{
scanf("%d",&N);
for(int i=1;i<=N;i++)
scanf("%d",&a[i]);
sort(a+1,a+1+N);
int ans=0;
a[0]=0;
for(int i=N;i>=1;i-=2)
ans^=(a[i]-a[i-1]-1);
if(ans)   printf("Georgia will win\n");
else   printf("Bob will win\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: