【博弈论】【SG函数】bzoj1457 棋盘游戏

一开始就必胜的特判一下。

#include<cstdio>
#include<cstring>
#include<set>
#include<algorithm>
using namespace std;
int T,n,X[1001],Y[1001],SG[101][101];
int sg(int x,int y)
{
	if(SG[x][y]!=-1) return SG[x][y];
	set<int>S;
	for(int i=1;i<x;++i) if(x-i!=y) S.insert(sg(x-i,y));
	for(int i=1;i<y;++i) if(x!=y-i) S.insert(sg(x,y-i));
	int lim=min(x,y);
	for(int i=1;i<lim;++i) S.insert(sg(x-i,y-i));
	for(int i=0;;++i) if(S.find(i)==S.end()) return SG[x][y]=i;
}
int main()
{
	memset(SG,-1,sizeof(SG));
	scanf("%d",&T);
	for(;T;--T)
	  {
	  	scanf("%d",&n);
	  	int ans=0;
		for(int i=1;i<=n;++i)
		  {
		  	scanf("%d%d",&X[i],&Y[i]);
		  	if(X[i]==Y[i]||X[i]==0||Y[i]==0)
		  	  {
		  	  	puts("^o^");
		  	  	goto OUT;
		  	  }
		  }
		for(int i=1;i<=n;++i)
		  ans^=sg(X[i],Y[i]);
	  	puts(ans?"^o^":"T_T");
	    OUT:;
	  }
	return 0;
}
原文地址:https://www.cnblogs.com/autsky-jadek/p/4337269.html