HDU1536->SG函数

来源:互联网 发布:上海人工智能公司排名 编辑:程序博客网 时间:2024/05/24 00:53

HDU1536->SG函数


题意:

给出n堆石子,每次只能按照规定的取石子个数取,输出先手的胜负情况。

题解:

递归求出sg函数就能解决问题。

代码:

#include <stdio.h>#include <iostream>#include <string.h>#include <algorithm>using namespace std ;int s[110] , sg[10010] , n;//S数组要按从小到大排序 SG函数要初始化为-1 对于每个集合只需初始化1遍//n是集合s的大小 S[i]是定义的特殊取法规则的数组int SG_dfs(int x){    int i;    if(sg[x]!=-1)        return sg[x];    bool vis[110];    memset(vis,0,sizeof(vis));    for(i=0;i<n;i++){        if(x>=s[i])        {            SG_dfs(x-s[i]);            vis[sg[x-s[i]]]=1;        }    }    int e;    for(i=0;;i++)        if(!vis[i])        {            e=i;            break;        }    return sg[x]=e;}int main(){    int m , k , a , ans;    while(scanf("%d" , &n)!= EOF , n)    {        for(int i = 0 ; i < n ; i ++)            scanf("%d" , &s[i]) ;        memset(sg , -1 , sizeof(sg)) ;        sort(s , s+n) ;        scanf("%d" , &m) ;        while(m --)        {            scanf("%d" , &k) ;            ans = 0 ;            while(k --)            {                scanf("%d" , &a) ;                ans ^= SG_dfs(a) ;            }            if(ans == 0) printf("L") ;            else printf("W") ;        }        printf("\n") ;    }    return 0 ;}
0 0