hdu1536博弈论sg函数

用sg函数对每组数据中所有的数处理。。得到的结果异或。为0必输。。否则必胜

#include<iostream>

//#include<algorithm>

#include<set>

#include<cstdio>

using namespace std;

//const int MAXK=102;

const int MAXM=102;

//const int MAXL=102;

const int MAXH=10002;

set<int>de;

int dp[MAXH];

inline int sg(int cur)

{

    if(dp[cur]!=-1)

    {

        return dp[cur];

    }

    int i;

    set<int>::const_iterator cp;

    bool visited[MAXM];

    memset(visited,0,sizeof(visited));

    if(cur==0)

    {

        return dp[cur]=0;

    }

    bool tag=0;

    for(cp=de.begin();cp!=de.end();cp++)

    {

        if(cur-*cp>=0)

        {

            int r;

            if(dp[cur-(*cp)]!=-1)

            {

                r=dp[cur-(*cp)];

            }else

            {

                r=sg(cur-(*cp));

            }

            if(r==0)

            {

                tag=1;

            }

            //cout<<r<<" ";

            visited[r]=1;

        }else

        {

            break;

        }

    }

    i=0;

    int mex;

    if(tag)

    {

        int j=0;

        while(visited[j])

        {

            j++;

        }

        return dp[cur]=j;

    }else

    {

        return dp[cur]=0;

    }

}

int main()

{

    int k;

    while(scanf("%d",&k)!=EOF)

    {

        memset(dp,-1,sizeof(dp));

        de.clear();

        if(k==0)

        {

            break;

        }

        int i;

        for(i=0;i<=k-1;i++)

        {

            int s;

            scanf("%d",&s);

            de.insert(s);

        }

        int m;

        scanf("%d",&m);

        bool result[MAXM];

        /*for(i=0;i<=10000;i++)

        {

            sg(i);

        }*/

        for(i=0;i<=m-1;i++)

        {

            int l;

            scanf("%d",&l);

            int j=0;

            int sum=0;

            for(j=0;j<=l-1;j++)

            {

                int heap;

                scanf("%d",&heap);

                sum=sum^sg(heap);

            }

            if(sum)

            {

                result[i]=1;

            }else

            {

                result[i]=0;

            }



        }

        for(i=0;i<=m-1;i++)

        {

            if(result[i])

            {

                printf("W");

            }else

            {

                printf("L");

            }

        }

        printf("\n");

    }

    return 0;

}

  

你可能感兴趣的:(HDU)