分析:
后继状态有限制的Nim游戏
直接暴力计算SG函数即可
tip
写完了就WA
拍了一下,也没什么问题
吃饭的时候突然恍然大悟:给出的s集不一定是递增的
一开始我的写法是:for (int j=1;j<=n&&s[j]<=i;j++)
这样遍历的话,一旦遇到一个
>i
的数就会终止循环
所以改一下:
for (int j=1;j<=n;j++)
if (i>=f[j]) p[SG[i-f[j]]]=1;
即可
看来对于c++的一些语句的执行还是要深入理解啊
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=10010;
int n,m,f[105],l;
int SG[N];
bool p[N];
void prepare()
{
memset(SG,0,sizeof(SG));
for (int i=1;i<=10000;i++)
{
memset(p,0,sizeof(p));
for (int j=1;j<=n;j++)
if (i>=f[j]) p[SG[i-f[j]]]=1;
for (int j=0;;j++)
if (!p[j]) {SG[i]=j;break;}
}
}
int main()
{
while (scanf("%d",&n)!=EOF&&n)
{
for (int i=1;i<=n;i++) scanf("%d",&f[i]);
prepare();
scanf("%d",&m);
for (int i=1;i<=m;i++)
{
scanf("%d",&l);
int x,ans=0;
for (int j=1;j<=l;j++)
{
scanf("%d",&x);
ans^=SG[x];
}
if (ans) printf("W");
else printf("L");
}
printf("\n");
}
return 0;
}