zoj 1024
#include<stdio.h>
#include<memory.h>//亚当每天的输赢
int isWin[102][13][32];
//每个月最多的天数
int maxDay[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
//判断输赢
int judge(int y,int m, int d)
{
int win; //输赢
//递归结束条件
//夏娃将日期变过头
if(y>101||(y==101&&(m>11||(m==11&&d>4)))) return 1;
//夏娃已经成功
if(y==101&&m==1&&d==4) return 0;
//把这一天亚当的输赢计算出来
if(isWin[y][m][d]==-1)
{
//首先改变月份
win = 0;
if(m!=12) //如果不是12月
{
//下个月有同一天或者闰年
if(d<=maxDay[m+1]||(d==29&&m==1&&(y%4)==0&&y!=0))
if(judge(y,m+1,d)==0) win = 1;
}
//如果是12月,明年一月份的同一天
else if(judge(y+1,m,d)==0) win = 1;
//如果改变月份还没有获胜,接着改变日期
if(win==0)
{
if(d<maxDay[m])
win = 1-(judge(y,m,d+1));
else if(m!=12)
win = 1-(judge(y,m+1,d));
else
win = 1- (judge(y+1,m,d));
}
isWin[y][m][d] = win;
}
return isWin[y][m][d];
}
int main()
{
int iCase;
int m,d,y;
//只要进行一次初始化,每次计算结果都是有用的
memset(isWin,255,sizeof(isWin));
scanf("%d",&iCase);
while(iCase--){
scanf("%d%d%d",&y,&m,&d);
if(judge(y-1900,m,d)==1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}