关闭

带一个圆环的尼姆博弈

130人阅读 评论(0) 收藏 举报
分类:

题目: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;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:8686次
    • 积分:828
    • 等级:
    • 排名:千里之外
    • 原创:78篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条