题意
一行 n 个空白格子,两人轮流往任意空白格子里画×。最先连出三个x的人获胜。问先手必胜还是后手必胜。
思路
SG函数。
用set可能会超时,n 不太大的情况下可以用 bool 数组标记。具体见代码
链接
http://poj.org/problem?id=3537
代码
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n;
int sg[2010];
int SG(int n)
{
if (n < 0) return 0;
if (sg[n] >= 0) return sg[n];
bool vis[2010];
memset(vis, false, sizeof vis);
for (int i = 1; i <= n; ++i)
{
vis[SG(i - 3) ^ SG(n - i - 2)] = true;
}
while (vis[++sg[n]]);
return sg[n];
}
int main(){
memset(sg, -1, sizeof sg);
while(scanf("%d", &n) == 1){
cout << ((SG(n) > 0) ? 1 : 2) << endl;
}
return 0;
}