POJ 3537 Crosses and Crosses



Crosses and Crosses
Time Limit: 3000MSMemory Limit: 65536K
Total Submissions: 2237Accepted: 821
Case Time Limit: 2000MS

Description

The game of Crosses and Crosses is played on the field of 1 × n cells. Two players make moves in turn. Each move the player selects any free cell on the field and puts a cross ‘×’ to it. If after the player’s move there are three crosses in a row, he wins.

You are given n. Find out who wins if both players play optimally.

Input

Input file contains one integer number n (3 ≤ n ≤ 2000).

Output

Output ‘1’ if the first player wins, or ‘2’ if the second player does.

Sample Input

#13
#26

Sample Output

#11
#22

Source

Northeastern Europe 2007, Northern Subregion 

取一个的话周围5个都不能再取了。。。。

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int sg[2200],N;

int SG_dfs(int x)
{
    if(x<=0return 0;
    if(sg[x]!=-1return sg[x];
    int i; bool flag[2200];
    memset(flag,false,sizeof(flag));
    for(i=1;i<=x/2+1;i++)
    {
        flag[SG_dfs(i-3)^SG_dfs(x-i-2)]=true;
    }
    for(i=0;i<=x;i++)
        if(!flagbreak;
    return sg[x]=i;
}

int main()
{
    memset(sg,-1,sizeof(sg));
    while(scanf("%d",&N)!=EOF)
    {
        printf("%d ",SG_dfs(N)?1:2);
    }
    return 0;
}
* This source code was highlighted by YcdoiT. ( style: Codeblocks )

原文地址:https://www.cnblogs.com/CKboss/p/3350858.html