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

 

你可能感兴趣的:(poj)