Crosses and Crosses
Time Limit: 3000 MS Memory Limit: 65536 K
Total Submissions: 1866 Accepted: 687
Case Time Limit: 2000 MS
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
Source
Northeastern Europe 2007, Northern Subregion
Place an X in the first position, which can be divided into two sub-games, I-3 and n-I-2.
[Cpp]
# Include <iostream>
# Include <cstdlib>
# Include <stdio. h>
# Include <memory. h>
Using namespace std;
Int sg [2100];
Int dfs (int n)
{
If (n <0) return 0; // n <0
If (sg [n]> = 0) return sg [n];
Bool g [2001] = {0 };
For (int I = 1; I <= n; I ++)
{
Int t = dfs (I-3) ^ dfs (n-i-2 );
G [t] = 1;
}
For (int I = 0; I ++)
If (g [I] = 0) return sg [n] = I;
}
Int main ()
{
Memset (sg,-1, sizeof (sg ));
Int n;
While (scanf ("% d", & n )! = EOF)
{
If (dfs (n) puts ("1 ");
Else puts ("2 ");
}
}