POJ - 3537 Crosses and Crosses (MLI - SG)

题意:两个小伙伴玩游戏,在一个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;
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值