【POJ2960】S-Nim(博弈SG函数)

题目描述

传送门

题解

简单的SG函数。根据规则建立SG函数。其中sg[0]=0。

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

const int max_n=105;
const int max_sg=10005;

int n,m,k,x,ans;
int rule[max_n],sg[max_sg],ext[max_sg];

inline void get_sg(){
    memset(sg,0,sizeof(sg));

    for (int i=1;i<=10000;++i){
        memset(ext,0,sizeof(ext));
        for (int j=1;j<=n;++j){
            if (i-rule[j]<0) break;
            ext[sg[i-rule[j]]]=true;
        }
        for (int j=0;;j++)
          if (!ext[j]){
            sg[i]=j;
            break;
          }
    }
}

int main(){
// freopen("input.in","r",stdin);
    while (~scanf("%d",&n)){
        if (!n) break;
        for (int i=1;i<=n;++i)
          scanf("%d",&rule[i]);
        sort(rule+1,rule+n+1);
        get_sg();
        scanf("%d",&m);
        for (int i=1;i<=m;++i){
            scanf("%d",&k);
            ans=0;
            for (int j=1;j<=k;++j)
              scanf("%d",&x),ans^=sg[x];
            if (!ans) printf("L");
            else printf("W");
        }
        printf("\n");
    }
}

你可能感兴趣的:(【POJ2960】S-Nim(博弈SG函数))