思路:
只能取指定个数时,使用打表法,注意细节即可
代码:
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int N=10005;
int f[N],SG[N],S[N];
void getSG(int n,int m) //n表示所求SG长度,m表示f数组长度
{
int i,j;
sort(f,f+m);
memset(SG,0,sizeof(SG));
//因为SG[0]始终等于0,所以i从1开始
for(i = 1; i <= n; i++)
{
//每一次都要将上一状态 的 后继集合 重置
memset(S,0,sizeof(S));
for(j = 0; f[j] <= i && j<m; j++)
S[SG[i-f[j]]] = 1; //将后继状态的SG函数值进行标记
for(j = 0;; j++) if(!S[j])
{ //查询当前后继状态SG值中最小的非零值
SG[i] = j;
break;
}
}
}
int main()
{
int n,m;
cin>>n;
for(int i=0;i<n;i++)
cin>>f[i];
getSG(10005,n);
cin>>m;
while(m--)
{
int d;
int ans=0;
cin>>d;
for(int i=0;i<d;i++)
{
int a;
cin>>a;
ans^=SG[a];
}
if(ans==0) cout<<"L";
else cout<<"W";
}
cout<<endl;
return 0;
}