hdu 1536 博弈 sg N堆石子 取数集合S 判断先手是否会赢

本题用了打表的形式,求出了1000内的sg值,非常直接

参考代码(http://www.cnblogs.com/lzsz1212/archive/2012/01/06/2315337.html

# include <stdio.h>
# include <string.h>

int sg[10010] ;
int k, knum[110] ;
int flag[110] ;

int met(int n)
{
    int i, ans = 0 ;
    memset (flag, 0, sizeof(flag)) ;
    for (i = 0 ; i < k ; i++)
        if (n - knum[i] >= 0)
            flag[sg[n - knum[i]]] = 1 ;
    for (i = 0 ; i <= 101 ; i++)
        if (flag[i] == 0) return i ;
}

void Sprague_Grundy()
{
    int i ;
    for (i = 1 ; i <= 10000 ; i++)
        sg[i] = met(i) ;
}

int main ()
{
    int i, n, l, num, ans ;
    while (~scanf ("%d", &k) && k)
    {
        for (i = 0 ; i < k ; i++)
            scanf ("%d", &knum[i]) ;
        Sprague_Grundy() ;
        scanf ("%d", &n) ;
        while (n--)
        {
            ans = 0 ;
            scanf ("%d", &l) ;
            while (l--)
            {
                scanf ("%d", &num) ;
                ans ^= sg[num] ;
            }
            printf (ans == 0 ? "L" : "W") ;
        }
        printf ("\n") ;
    }
    return 0 ;
}

  

posted @ 2012-04-03 12:03  shijiwomen  阅读(230)  评论(0编辑  收藏  举报