Crosses and Crosses
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
Sample Output
Source
Northeastern Europe 2007, Northern Subregion
|
[Submit] [Go Back] [Status] [Discuss]
题目大意:有n个格子,每个人可以选择任意一个空格子画×,如果某个人下完后有三个×相连,则这个人胜利。
题解:这个题是一个Multi-SG游戏。对于当前状态,我们如果选取了位置i,那么对手一定不会把棋子下到i-1,i-2,i+1,i+2这个位置,要不我们就赢了,所以下完后就变成了(i-3) (x-i-2)两个子状态。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#define N 2003
using namespace std;
int n,m,sg[N];
int get(int x)
{
if (x<=0) return 0;
if (sg[x]!=-1) return sg[x];
int hash[N];
memset(hash,0,sizeof(hash));
for (int i=1;i<=x;i++){
int t=get(i-3);
int t1=get(x-i-2);
hash[t^t1]=1;
}
for (int i=0;i<=x;i++)
if (!hash[i]) {
sg[x]=i;
break;
}
return sg[x];
}
int main()
{
freopen("a.in","r",stdin);
memset(sg,-1,sizeof(sg)); sg[0]=0;
while (scanf("%d",&n)!=EOF){
get(n);
if (sg[n]) puts("1");
else puts("2");
}
}