HDU-1847(裸SG)

1、  总共n张牌;
2、  双方轮流抓牌;
3、  每人每次抓牌的个数只能是2的幂次(即:1,2,4,8,16…)
4、  抓完牌,胜负结果也出来了:最后抓完牌的人为胜者;
假设Kiki和Cici都是足够聪明(其实不用假设,哪有不聪明的学生~),并且每次都是Kiki先抓牌,请问谁能赢呢?

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
const int maxn =1005;
const int INF  =1e9;

int f[12],sg[maxn];
int n;
int getSG(int x)
{
    if(sg[x]!=-1)
        return sg[x];
    int vis[maxn];
    memset(vis,0,sizeof vis);
    for(int i=0;i<=9;i++)
    {
        int temp = x - f[i];
        if(temp<0)
            break;
        sg[temp] = getSG(temp);
        vis[sg[temp]] = 1;
    }
    for(int i=0;;i++)
    {
        if(!vis[i])
        {
            sg[x] = i;
            break;
        }
    }
    return sg[x];
}
int main()
{
    for(int i = 0; i<=9; i++)
    {
            f[i] = pow(2,i);
    }

    while(scanf("%d",&n) != EOF)
    {
        memset(sg,-1,sizeof sg);

        if(getSG(n)== 0)
            cout<<"Cici"<<endl;
        else
            cout<<"Kiki"<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41934068/article/details/81675973