HDU 1536 S-Nim

师时隔几个月后,在看博弈NIM终于懂了,做出了第一道根据所有堆的异或和的题

题意:在一个Si容器中,输入可以行走的步数,然后在下面T组测试数据中,输入堆的情况

View Code
#include<stdio.h>

#include<algorithm>

using namespace std;

//数组超是开小了 还是开大了

int enable[101];//可以行走的步数 

int SG[10001];//SG的数组大小是一堆石子的大小而不是数组的多少的大小 要区别

int k;



bool cmp(int &a,int &b)

{

    return a<b;

}



int get_SG(int a)

{

    int temp,i;

    int judge[110]={0};//用来寻找mex点 

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

    {

        temp=a-enable[i];

        if(temp<0)  break;

        if(SG[temp]==-1)  

            SG[temp]=get_SG(temp);

        judge[SG[temp]]=1;

    }

    for (i=0;;i++)

        if(judge[i]==0) return i;

}



int main()

{

    int T,i,n,am,j;

    while(scanf("%d",&k) && k)

    {

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

            scanf("%d",&enable[i]);

        sort(enable,enable+k,cmp);//这里是题目的坑。。。 

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

        scanf("%d",&T);

        for (i=0;i<T;i++)

        {

           scanf("%d",&n);

           int ans=0;

           for (j=0;j<n;j++)//这里是第二次错了,当前面循环有i的时候这里不可以用i 

           {

               scanf("%d",&am);

               if(SG[am]==-1)

                   SG[am]=get_SG(am);

               ans^=SG[am];

           }

           if(ans) printf("W");

           else printf("L");

        }

        printf("\n");

    }

    return 0;

}

 

你可能感兴趣的:(HDU)