Crosses and Crosses
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 3063 | Accepted: 1196 | |
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 |
Source
Northeastern Europe 2007, Northern Subregion
【思路】
SG函数,博弈
题目treblecross的简化。
【代码】
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 5 const int N = 2000+10; 6 7 int sg[N],n; 8 9 int dfs(int x) { 10 if(x<=0) return 0; 11 if(sg[x]!=-1) return sg[x]; 12 int vis[N]; 13 memset(vis,0,sizeof(vis)); 14 for(int i=1;i<=x;i++) 15 vis[dfs(i-3)^dfs(x-i-2)]=1; 16 for(int i=0;;i++) 17 if(!vis[i]) return sg[x]=i; 18 } 19 20 int main() { 21 memset(sg,-1,sizeof(sg)); 22 while(scanf("%d",&n)==1) { 23 if(dfs(n)) puts("1"); 24 else puts("2"); 25 } 26 return 0; 27 }