poj 3575 Crosses and Crosses(SG函数)

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 }
原文地址:https://www.cnblogs.com/lidaxin/p/5173234.html