bzoj1457: 棋盘游戏 SG函数 Nim
Code:
#include<cstdio> #include<cstring> using namespace std; #define maxn 1003 #define r 99 int n, x[maxn],y[maxn],SG[102][102],tag[6000000]; bool check(int xi,int yi){ if(xi==0||yi==0||xi==yi) return true; return false; } void get(int xi,int yi){ int id=yi*99+xi; for(int i=xi-1;i>=0;--i) if(!check(i,yi))tag[SG[i][yi]]=id; for(int i=yi-1;i>=0;--i) if(!check(xi,i))tag[SG[xi][i]]=id; for(int i=xi-1,j=yi-1;i>=0&&j>=0;--i,--j) if(!check(i,j))tag[SG[i][j]]=id; for(int i=0;;++i) if(tag[i]!=id) { SG[xi][yi]=i; break;} } int main(){ // freopen("input.in","r",stdin); for(int i=0;i<=r;++i) //y-cordinate for(int j=0;j<=r;++j) //x-cordinate if(!check(j,i)) get(j,i); int T; scanf("%d",&T); while(T--){ int n,ans=0,flag=0; scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d%d",&x[i],&y[i]); if(check(x[i],y[i])) flag=1; ans^=SG[x[i]][y[i]]; } if(flag || ans) printf("^o^\n"); else printf("T_T\n"); } return 0; }