跟撕纸那个一样。一开始就必胜的特判一下。
#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; }
时间: 2024-10-08 20:43:23