1. 程式人生 > >[POJ3537]Crosses and Crosses

[POJ3537]Crosses and Crosses

題目 n) color ring light return 最優 遊戲 main

題目大意:

有n個點排成一排,兩人,每人每次選一個點,則該點和該點左邊兩個、右邊兩個都不能被選了。雙方都選擇最優策略,問先手贏還是後手贏。

解題思路:

每次相當於把遊戲分成左右兩個子遊戲,分別計算sg值即可。

C++ Code:

#include<cstdio>
#include<cstring>
int sg[5005],n;
int dfs(int n){
    if(n<=0)return 0;
    if(sg[n]!=-1)return sg[n];
    bool vis[n+2];
    memset(vis,0,sizeof vis);
    for(int i=1;i<=n;++i)
    vis[dfs(i-3)^dfs(n-i-2)]=1;
    for(int i=0;;++i)
    if(!vis[i])return sg[n]=i;
}
int main(){
    memset(sg,-1,sizeof sg);
    while(~scanf("%d",&n))
    puts(dfs(n)?"1":"2");
    return 0;
}

[POJ3537]Crosses and Crosses