这题就是2001 11 4为先手必败态,然后进行dfs暴力转移,sg数组并不是sg函数值= =。网上还有其他解法,就是利用奇偶性,只有9.30,11.30是不改变奇偶性地,其他都改变。那个貌似几行代码就写完了。、、、我还是太菜了想不到。
#include<cstdio>
#include<cstring>
int y,m,d;
int day[410];
int sg[110][13][32];
int mm[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
void prework()
{
memset(sg,-1,sizeof(sg));
for(int i=1900;i<=2001;i++)
if(i%4==0 && i%100!=0 || i%400==0)
day[i-1900+1]=29;
else
day[i-1900+1]=28;
sg[101][11][4]=0;
for(int i=5;i<=mm[11];i++)
sg[101][12][i]=1;
for(int i=1;i<=mm[12];i++)
sg[101][12][i]=1;
}
int g(int y,int m,int d)
{
if(sg[y][m][d]!=-1) return sg[y][m][d];
int flag=0;
if(y>101) return sg[y][m][d]=0;
if(m==2 && d==day[y] || m<12 && mm[m]==d && mm[m+1]>=d)
{
int a=g(y,m+1,d),b=g(y,m+1,1);
if(a==0 || b==0)
return sg[y][m][d]=1;
else
return sg[y][m][d]=0;
}
else
if(m<12 && mm[m]==d && mm[m+1]<d)
{
int a=g(y,m+1,1);
if(a==0)
return sg[y][m][d]=1;
else
return sg[y][m][d]=0;
}
else
if(m==2 && d<day[y] || m<12 && d<mm[m])
{
int a=g(y,m,d+1),b=g(y,m+1,d);
if(a==0 || b==0)
return sg[y][m][d]=1;
else
return sg[y][m][d]=0;
}
else
if(m==12 && d<mm[12])
{
int a=g(y,m,d+1),b=g(y+1,1,d);
if(a==0 || b==0)
return sg[y][m][d]=1;
else
return sg[y][m][d]=0;
}
else
if(m==12 && d==mm[12])
{
int a=g(y+1,1,1),b=g(y+1,1,d);
if(a==0 || b==0)
return sg[y][m][d]=1;
else
return sg[y][m][d]=0;
}
}
int main()
{
int t;
prework();
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&y,&m,&d);
y-=1900;
g(y,m,d);
if(sg[y][m][d]==1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}