poj2960 S-Nim

  1. 大意:有n堆石子,每堆石子个数已知,两人轮流从中取石子, 
  2. 每次可取的石子数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("
");
45     }
46 }
原文地址:https://www.cnblogs.com/qzqzgfy/p/5266803.html