//博弈论之SG函数(第一道SG)
//题意 :输入比较麻烦,有n堆石头每次只能取S集合中的数字颗数,取完最后一颗为胜,问先手胜负;
//输入:S集合中有t个数;对于这个测试用例有l个询问行,接下来每个询问行的第一个数为石头的堆数,接下来则是每堆石头的个数
//思路:对于每个S集合打出sg[]函数的表出来。然后异或之结果就好了;已经打好了的不必要再次操作了、
#include"stdio.h"
#include"string"
using namespace std;
#define MAXV 10001
int sg[MAXV];
int num[101];
int t;
int get_sg(int n)
{
if(n==0) return 0;
int i;
int mex[101]={0};
for(i=0;i<t;i++)
{
if(n>=num[i]){
if(sg[n-num[i]]==-1)
sg[n-num[i]]=get_sg(n-num[i]);
mex[sg[n-num[i]]]=1;
}
}
for(i=0;;i++)
if(mex[i]==0)
return i;
}
int main()
{
int i,j;
int l;
int x;
int y;
int ans;
while(scanf("%d",&t)!=EOF && t)
{
memset(sg,-1,sizeof(sg));
for(i=0;i<t;i++)
{
scanf("%d",&num[i]);
}
scanf("%d",&l);
for(i=0;i<l;i++)
{
scanf("%d",&y);
ans=0;
for(j=0;j<y;j++)
{
scanf("%d",&x);
if(sg[x]==-1)
{
sg[x]=get_sg(x);
}
ans=ans^sg[x];
}
if(ans==0) printf("L");
else printf("W");
}
printf("\n");
}
return 0;
}
HDU_1536 博弈论-sg函数
最新推荐文章于 2024-09-02 22:11:16 发布