poj2960 S-Nim

时间:2023-03-09 17:38:54
poj2960 S-Nim
  1. 大意:有n堆石子,每堆石子个数已知,两人轮流从中取石子,
  2. 每次可取的石子数x满足x属于集合S(k) = {s1,s2,s3...sk-1},问先拿者是否有必胜策略?

裸nim,可以用记忆化搜索。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
int sg[],s[],k,T,m,x;
void get(int x){
if (sg[x]!=-) return;
bool mark[];
memset(mark,,sizeof mark);
int tmp;
for (int i=;i<=k;i++){
tmp=x-s[i];
if (tmp>=){
if (sg[tmp]==-) get(tmp);
mark[sg[tmp]]=;
}
}
for (int i=;;i++)
if (mark[i]==) {
sg[x]=i;
return;
}
}
int main(){
while (~scanf("%d",&k)){
if (k==) return ;
for (int i=;i<=k;i++)
scanf("%d",&s[i]);
for (int i=;i<=;i++)
sg[i]=-;
scanf("%d",&T);
while (T--){
scanf("%d",&m);
int ans=;
for (int i=;i<=m;i++){
scanf("%d",&x);
if (sg[x]==-) get(x);
ans^=sg[x];
}
if (ans) printf("W");else printf("L");
}
printf("\n");
}
}