POJ 2960 S-Nim<博弈>

链接:http://poj.org/problem?id=2960

 1 #include<stdio.h>
 2 #include<string.h>
 3 const int N = 10001;
 4 const int M= 101;
 5 int SG[N];//SG[i]记录一堆i颗石子的SG状态
 6 int s[M];//存储可选取的石子数目集合
 7 int k;//s[]集合中的元素个数
 8 int mex(int x)
 9 {
10     if( SG[x]!=-1 )return SG[x];
11     bool vi[N]={0};
12     for( int i=0; i<k; ++ i ){
13         if( s[i] <= x ){
14             vi[mex(x-s[i])]=1;
15         }
16     }
17     int i=0;
18     while(vi[i])++i;
19     return SG[x]=i;
20 }
21 int main()
22 {
23     while(scanf("%d",&k)!=EOF)//可选集合中的元素个数
24     {
25         if(k==0)break;
26         int i,ans;
27         for(i=0; i<k; i++)
28             scanf("%d",&s[i]);
29         memset(SG,-1,sizeof(SG));
30         SG[0]=0;
31         int m;
32         scanf("%d",&m);//测试组数
33         while(m--)
34         {
35             ans=0;
36             int l;
37             scanf("%d",&l);//石子堆数
38             while(l--)
39             {
40                 int x;
41                 scanf("%d",&x);//当前堆石子数目
42                 if(SG[x]==-1)
43                     SG[x]=mex(x);
44                 ans=ans^SG[x];
45             }
46 
47             if(ans==0)printf("L");
48             else
49                 printf("W");
50         }
51 
52         printf("\n");
53     }
54 
55     return 0;
56 }
View Code

 

posted @ 2013-07-27 19:58  淡墨æ末央  阅读(150)  评论(0编辑  收藏  举报