现在的位置: 首页 > 综合 > 正文

杭电 1944

2014年03月07日 ⁄ 综合 ⁄ 共 894字 ⁄ 字号 评论关闭

题意:有L堆得珠子,Arthur 和 Caroll两个人轮流取,但每次取的个数是在集合S中选择,假如S={2,5},那就只能选择拿2个或者5个。判断起始位置是winning position 打印 'W',是losing position 打印 'L'。

 

思路:简单,求SG值

 

代码:

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


int f[101];//记录S的值
int sg[10001];
int k;
char str[101];//记录打印的值

int cmp(const int *a,const int *b)
{
	return *a-*b;
}

int mex(int b)
{
	int a[101]={0};
    int i;
    for(i=0;i<k;i++)
    {
        if(b-f[i]<0)//b-f无后继点
            break;
        if(sg[b-f[i]]==-1)
        {
            sg[b-f[i]]=mex(b-f[i]);
        }
        a[sg[b-f[i]]]=1;
    }
    for(i=0;i<=k;i++)//总共只有K个数,所以sg值不会超过K
        if(!a[i])
        {
            return i;
        }
}

int main()
{
    int i,t,n,s,bead,num;
    while(scanf("%d",&k),k)
    {
        for(i=0;i<k;i++)//输入S值
        {
            scanf("%d",&f[i]);
        }
        memset(sg,-1,sizeof(sg));
	    
		//puts("adsad");
  
		qsort(f,k,sizeof(int),cmp);
       
		//puts("adsa");

        sg[0]=0;
		num=0;
        scanf("%d",&t);//测试个数
        while(t--)
        {
            scanf("%d",&n);//堆数
            s=0;
            while(n--)
            {
                scanf("%d",&bead);//该堆的成员个数
                if(sg[bead]==-1)
                    sg[bead]=mex(bead);
                s=s^sg[bead];
            }
            if(s==0)
                str[num]='L';
            else
                str[num]='W';
			num++;
        }
		str[num]=0;
		puts(str);
    }
    return 0;
}

 

抱歉!评论已关闭.