题意】
从左到右有一排石子,给出石子所在的位置。规定每个石子只能向左移动,且不能跨过前面的石子。最左边的石子最多只能移动到1位置。每次选择一个石子按规则向移动,问先手是否能赢。
思路:见挑战p313,已经很详细了。
记住下一nim博弈论的模型,即有一堆石头x1,x2,x3...xn (xi表示第i堆石头数量),让两个人取,谁去除最后的石头谁就赢。每次至少取一个,最多只能取一堆石头。
最后就是x1^x2^x3.....^xn,如果结果>0则先取赢,否则后取赢
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int s[1005],t[1005],cnt;
int nim()
{
int temp=0;
for(int i=0;i<cnt;i++)
{
temp^=t[i];
}
return temp;
}
int main()
{
int T,n;
freopen("t.txt","r",stdin);
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
s[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i]);
}
sort(s+1,s+1+n);
if(n&1)
{
cnt=0;
for(int i=1;i<=n;i=i+2)
{
t[cnt++]=s[i]-s[i-1]-1;
}
}
else
{
cnt=0;
for(int i=2;i<=n;i=i+2)
{
t[cnt++]=s[i]-s[i-1]-1;
}
}
if(nim()) printf("Georgia will win\n");
else printf("Bob will win\n");
}
return 0;
}