Crosses and Crosses
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 2237 | Accepted: 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
#1 | 3 |
---|---|
#2 | 6 |
Sample Output
#1 | 1 |
---|---|
#2 | 2 |
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<=0) return 0; if(sg[x]!=-1) return 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(!flag 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; } |