hdu1524博弈论sg函数

通过这道题目我们更加可以看清楚sg函数中的图的一些性质。。

#include<iostream>

#include<vector>

using namespace std;

const int MAXN=1002;

vector<int>v[MAXN];

int dp[MAXN];

int sg(int p)

{

    if(dp[p]!=-1)

    {

        return dp[p];

    }

    int i;

    bool visited[MAXN];

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

    for(i=0;i<=int(v[p].size())-1;i++)

    {

        visited[sg(v[p][i])]=1;

    }

    i=0;

    while(visited[i])

    {

        i++;

    }

    return dp[p]=i;

}

int main()

{

    int n;

    while(cin>>n)

    {

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

        int i=0;

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

        {

            v[i].clear();

        }

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

        {

            int m;

            cin>>m;

            while(m--)

            {

                int to;

                cin>>to;

                v[i].push_back(to);

            }

        }

        int tn;

        while(cin>>tn)

        {

            if(tn==0)

            {

                break;

            }

            int sum=0;

            while(tn--)

            {

                int pos;

                cin>>pos;

                sum=sum^sg(pos);

            }

            if(sum)

            {

                cout<<"WIN"<<endl;

            }else

            {

                cout<<"LOSE"<<endl;

            }

        }

    }

    return 0;

}

  

你可能感兴趣的:(HDU)