首页 > 其他 > 详细

poj 3537 Crosses and Crosses (SG)

时间:2014-10-03 03:25:34      阅读:292      评论:0      收藏:0      [点我收藏+]

题意:

 1 × n 个格子,每人每次选一个格子打上叉(不得重复),如果一个人画完叉后出现了连续的三个叉,则此人胜。

给n,判断先手胜还是先手败。

 

思路:

假设选择画叉的位置是i,则对方只能在前[1,i-3]中或[i+3,n]中选择画叉。子问题出现。

根据SG的定义,即可求出SG(N)。看代码。

 

代码:

int sg[2005];
int n;

int dfs(int n){
    if(n<0)
        return 0;
    if(sg[n]!=-1)
        return sg[n];

    bool g[2005] = {0};
    rep(i,1,n){
        int t=dfs(i-3)^dfs(n-i-2);
        g[t]=true;
    }
    for(int i=0;;++i){
        if(!g[i])
            return sg[n]=i;
    }
}

int main(){
    mem(sg,-1);
    while(scanf("%d",&n)!=EOF){
        dfs(n);
        rep(i,0,n) printf("sg[%d]=%d\n",i,sg[i]);
        if(sg[n]==0)
            puts("2");
        else
            puts("1");
    }
}

 

poj 3537 Crosses and Crosses (SG)

原文:http://www.cnblogs.com/fish7/p/4004690.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!