题意:两个小伙伴玩游戏,在一个1*n的格子里面画x,谁先画到3个连续的x谁就赢
思路:要画3个连续的x的话,假设现在。表示的是你可以下的地方的话 如果你面临这样的局面
。。。。x。。。 那么首先 ,和X相邻的两个位置不能画(。。。。xx。。 或者 。。。xx。。) 这样后手在下一个就赢了,还有和x隔一个位置的地方也不能下 (。。x。x。。。 或者 。。。。x。x。),同理,所以你下了一个棋子(位置在i)其实把这整个格子分成了 i-3 和 n - 2 - i 个子游戏,然后打个sg表就好了
上代码:
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
const int maxn = 2100;
int SG[maxn];
int dfs(int n)
{
if(n < 0) return 0;
if(SG[n] != -1 ) return SG[n];
int vis[maxn];
memset(vis,0,sizeof(vis));
for(int i = 1 ; i <= n ; i++)
{
vis[dfs(i-3) ^ dfs(n-i-2)] = 1;
}
for(int i = 0 ; ; i ++)
{
if(!vis[i])
{
return SG[n] = i;
}
}
}
int main()
{
int n;
memset(SG,-1,sizeof(SG));
while(scanf("%d",&n) !=EOF)
{
if(dfs(n)) puts("1");
else puts("2");
}
return 0;
}