CF Gym 102059I Game on Plane(sg函数)

若如初见. 提交于 2019-12-01 13:49:37

链接:https://codeforces.com/gym/102059/problem/I

 

题意:给定N个点,围成一个圈,每次玩家选择两个点连线,不得与之前连的线相交。 如果玩家连线形成了一个多边形或者没有选的点,输。

题解:连一条边会划分成两个圈(子问题),跑sg函数

#include <bits/stdc++.h>
using namespace std;

const int maxn=5005;
int sg[maxn], vis[maxn];

void calsg()
{
    sg[0]=0; sg[1]=0; sg[2]=1;
    for(int i=3; i<maxn; i++)
    {
        memset(vis, 0, sizeof(vis));
        for(int j=0; j<=i-2; j++)
            vis[sg[j]^sg[i-j-2]]=1;
        for(int j=0; ; j++)
            if(!vis[j]){
                sg[i]=j; break;
            }
    }
}

int main()
{
    calsg();
    int T;
    for(cin>>T; T--; )
    {
        int n; cin>>n;
        printf(sg[n]?"First\n":"Second\n");
    }
    return 0;
}
View Code

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!