POJ 3537 Crosses and Crosses

題意:有個2人玩的遊戲在一個規模爲1*n的棋盤上進行,每次一個人選擇一個地方畫上'X',一旦某個人畫上X後出現了連續3個X,那麼這個人就贏了。給你n(3≤n≤=2000)問誰會贏。

題解:明顯的博弈論,關鍵是確定SG函數。
考慮到如果畫上一個X,就會有臨近區域不能畫X,也就是下一個人能畫X的區域就變了,那麼問題可以轉換爲誰不能畫X誰就輸了。
接着考慮每次畫X的轉移情況,最簡單的就是畫最左邊的1~3個格子,這時剩下還有n-3~n-5個連續區域能畫;如果畫在4~n-3位置,就會把原問題分成兩個子問題,都是SG博弈問題,所以直接求兩者異或就行了。

#include<cstdio>
#include<cstring>
using namespace std;
int sg[2005];
bool temp[2005];
int main()
{
    sg[0]=0;
    sg[1]=1;
    sg[2]=1;
    sg[3]=1;
    sg[4]=2;
    sg[5]=2;
    for(int i=6;i<=2000;i++)
    {
        memset(temp,false,sizeof(temp));
        temp[sg[i-3]]=temp[sg[i-4]]=temp[sg[i-5]]=true;
        for(int j=1;j<=i-5-j;j++)
            temp[sg[j]^sg[i-5-j]]=true;
        for(int j=0;j<=2000;j++)
            if(!temp[j])
            {
                sg[i]=j;
                break;
            }
    }
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        printf("%d\n",sg[n]?1:2);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章