hdu 1079 博弈

博弈+日期的处理

#include<stdio.h>
#include<memory.h>
int maxDay[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int isWin[102][13][32];		//判断该年,月,日是否被访问过 
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==11 && d==4)		//return 0返回的是必败点 
        return 0;
    if(isWin[y][m][d]==-1){			//该 年 月 日还未判断过 
        win=0;					//win 0和1分别为两个人的获胜情况 
        if(m!=12){				//月份不是12月
		//判断是否可能获胜 
            if(d<=maxDay[m+1] || (d==29 && m==1 && (y%4==0) && y!=0))	//是闰年的1月29号也就是能变到2月29
			//后面一个月的天数要小于或等于当前月的天数,也就是能变到下一个月 
                if(judge(y,m+1,d)==0)	//能够一次性变到那个点的都是必败点 
                    win=1;
        }else if(judge(y+1,1,d)==0)	//变到明年的1月 
                    win=1;
        if(win==0){				//变月不能获胜开始变日 
            if(d<maxDay[m])
            {
            	if(judge(y,m,d+1)==0)	//天数加1能够胜 
            	{
	            	win=1;
	            }
            }    	
               // win=1-judge(y,m,d+1);
            else if(m!=12)		//要变到1号了 
                win=1-judge(y,m+1,1);
            else	
                win=1-judge(y+1,1,1);	//变到明年的1月1号 
        }
        isWin[y][m][d]=win;
    }
    return isWin[y][m][d];
}
int main(){
    int iCase;
    int m,d,y;
    memset(isWin,-1,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;
}



你可能感兴趣的:(hdu 1079 博弈)