Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 4059 | Accepted: 1591 | |
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
题目链接:http://poj.org/problem?id=3537
【题意】有一个1*n的棋盘,两个选手轮流在一个空白的棋格上放X,当某个选手在棋盘上放上X后构成连续的三个X,则该选手获胜。
【思路】假设在第i个棋格处放一个X,则i-2,i-1,i+1,i+2处都不应该放(如果在放了,则必输),所有这个游戏就可以分成1*(i-3)和(n-(i+2))的两个游戏,然后按照sg求异或值即可。
【代码如下】
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int sg[2100],n;
int dfs(int x){
if(x <= 0) return 0;
if(~sg[x]) return sg[x];
bool vis[2100] = {false};
for(int i = 1; i <= x; i ++){
vis[dfs(i-3) ^ dfs(x - (i+2))] = true;
}
for(int i = 0; ; i ++){
if(!vis[i]){
sg[x] = i; break;
}
}
return sg[x];
}
int main(){
while(~scanf("%d",&n)){
memset(sg,-1,sizeof(sg));
printf("%d\n",dfs(n) ? 1 : 2);
}
return 0;
}