Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 2166 | Accepted: 800 | |
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
#1 | 3 |
---|---|
#2 | 6 |
Sample Output
#1 | 1 |
---|---|
#2 | 2 |
题意:在1*n的方格表中两人轮流画‘x’,谁先让三个‘x’连在一起,谁胜。
方法:第一个叉可以画在第1~3个格子,那么剩下的可以看做n-3~n-5个连续格子的游戏;若第一个叉画在第4~n-3个格子,那么可以看为连个游戏,用Nim。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int sg[2010];
void init()
{
bool used[2010];
int k;
sg[0]=0;
sg[1]=sg[2]=sg[3]=1;
sg[4]=sg[5]=2;
for(int i=6;i<=2000;i++)
{
memset(used,false,sizeof(used));
used[sg[i-3]]=used[sg[i-4]]=used[sg[i-5]]=true;
for(int j=1;j<=i-5-j;j++)
used[sg[j]^sg[i-5-j]]=true;
k=0;
while(used[k]) k++;
sg[i]=k;
}
}
int main()
{
int m;
init();
while(scanf("%d",&m)>0)
printf("%d\n",sg[m]?1:2);
return 0;
}