poj2960 S-Nim
- 大意:有n堆石子,每堆石子个数已知,两人轮流从中取石子,
- 每次可取的石子数x满足x属于集合S(k) = {s1,s2,s3...sk-1},问先拿者是否有必胜策略?
裸nim,可以用记忆化搜索。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<string> 6 #include<algorithm> 7 int sg[10005],s[10005],k,T,m,x; 8 void get(int x){ 9 if (sg[x]!=-1) return; 10 bool mark[10005]; 11 memset(mark,0,sizeof mark); 12 int tmp; 13 for (int i=1;i<=k;i++){ 14 tmp=x-s[i]; 15 if (tmp>=0){ 16 if (sg[tmp]==-1) get(tmp); 17 mark[sg[tmp]]=1; 18 } 19 } 20 for (int i=0;;i++) 21 if (mark[i]==0) { 22 sg[x]=i; 23 return; 24 } 25 } 26 int main(){ 27 while (~scanf("%d",&k)){ 28 if (k==0) return 0; 29 for (int i=1;i<=k;i++) 30 scanf("%d",&s[i]); 31 for (int i=0;i<=10000;i++) 32 sg[i]=-1; 33 scanf("%d",&T); 34 while (T--){ 35 scanf("%d",&m); 36 int ans=0; 37 for (int i=1;i<=m;i++){ 38 scanf("%d",&x); 39 if (sg[x]==-1) get(x); 40 ans^=sg[x]; 41 } 42 if (ans) printf("W");else printf("L"); 43 } 44 printf("\n"); 45 } 46 }