zju1024Calendar Game

#include<iostream>
#include<cstring>
using namespace std;
int maxd[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//每个月最多天数
int iswin[102][13][32];//以该天起始,亚当是否会赢 1会赢 0 会输 -1还没计算过
int judge(int y,int m,int d)
{
	int win=0;
	if(y==101&&m==11&&d==4)return 0;//若Eve成功
	if(y>101||(y==101&&(m==12||m==11&&d>4)))return 1;//若Eve失败
    //若还没计算该天
	if(iswin[y][m][d]==-1)
	{
		//先改变月份
		if(m!=12)
		{
			if(d<=maxd[m+1])win=1-judge(y,m+1,d);//与夏娃的胜负相反
			else if(m==1&&d==29&&(y%4==0&&y!=0))win=1-judge(y,m+1,d);
		}
		else win=1-judge(y+1,1,d);
		//若改变月份失败,再改变日期
		if(win==0)
		{
             if(d<maxd[m])win=1-judge(y,m,d+1);//第二天
			 else if(d==28&&m==2&&y%4==0&&y!=0)win=1-judge(y,m,d+1);//第二天
			 else if(m!=12)win=1-judge(y,m+1,1);//下个月首
			 else if(m==12)win=1-judge(y+1,1,1);//元旦
			
		} 
		iswin[y][m][d]=win;
	}
    //若已经计算直接返回
	return (iswin[y][m][d]);
	
	
}
int main()
{
	memset(iswin,-1,sizeof(iswin));
    int cas,y,m,d;
	cin>>cas;
	while(cas--)
	{
		
        cin>>y>>m>>d;
		if(judge(y-1900,m,d))cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
}
posted on 2011-05-14 12:56  4.5.6  阅读(201)  评论(0编辑  收藏  举报