带一个圆环的尼姆博弈

题目:hdu3980

题意:有一串含有n个珠子的链子。每个人每次只能给相邻的m个珠子涂色。谁先不能涂了谁就输了。

解答:重点:第一个人涂完之后它就变成了一条直线。然后每次在直线中选m个连续的涂完剩下两条抑或一下就行。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN = 1010;
int sg[MAXN];
int n,m;
int getsg(int a)
{
    if(sg[a] != -1)
        return sg[a];
    if(a < m)
        return 0;
    int vis[MAXN];
    memset(vis,0,sizeof(vis));
    for(int i = 0;i <= a-m;i++)
    {
        vis[getsg(i) ^ getsg(a-m-i)] = 1;
    }
    for(int i = 0;;i++)
    {
        if(!vis[i])
        {
            sg[a] = i;
            return i;
        }
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    for(int i = 1;i <= T;i++)
    {
        cin >> n >> m;
        cout << "Case #" << i << ": ";
        memset(sg,-1,sizeof(sg));
        if(n < m || getsg(n - m) != 0)
            puts("abcdxyzk");
        else
            puts("aekdycoin");
    }
    return 0;
}


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Sleppypot/article/details/52345756
个人分类: 博弈
想对作者说点什么? 我来说一句

android自定义带文本的圆环进度条

2016年04月27日 5.55MB 下载

没有更多推荐了,返回首页

不良信息举报

带一个圆环的尼姆博弈

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭