描述 Description
moreD 和 moreD 的宠物 CD 正在玩一个日历游戏,开始时,他们从 1900 年 1 月 1 日到 2012 年 12 月 22 日(你懂的……)选一个日期开始,依次按照如下规则之一向后跳日期:
跳到日历上的下一天。
跳到日历上的下个月的同一天(如果不存在,则不能这么做)。
要是谁正好到达 2012 年 12 月 22 日那么他就赢了,如果到达这天之后的日期那他就输了——原因你也懂的。
每次都是 moreD 先走的。
现在,给你一个日期,请问 moreD 一定能赢吗?
输入格式 InputFormat
输入共 T 行,每行三个整数,Y、M、D,分别表示年、月、日。日期在 1900 年 1 月 1 日到 2012 年 12 月 22 日之间(包含两端)。
T 并不在输入数据当中。
输出格式 OutputFormat
要是 moreD 一定能赢,输出一行 YES,否则输出 NO。
样例输入 SampleInput
1956 3 26
1985 9 27
2005 2 2
1966 11 28
1951 8 5
样例输出 SampleOutput
NO
YES
YES
NO
NO
代码 Code
枚举递推即可。
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int i,j,t,n,m,l,r,k,z,y,x;
bool f[2014][15][33];
int d,ty,tm,td;
inline bool pdnn(int y)
{
if (y%400==0 || (y%100!=0 && y%4==0)) return true;
else return false;
}
inline int getd(int y,int m)
{
if (m==13) return 31;
if (m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12) return 31;
if (m==4 || m==6 || m==9 || m==11) return 30;
if (m==2)
{
if (pdnn(y)) return 29;
else return 28;
}
}
inline bool nextday(int y,int m,int d)
{
if (d==getd(y,m))
{
d=1;
if (m==12)
{
m=1;y++;
}
else m++;
}
else d++;
return f[y][m][d];
}
inline bool nextmonth(int y,int m,int d)
{
if (m==12)
{
m=1;y++;
}
else m++;
return f[y][m][d];
}
int main()
{
freopen("calendar.in","r",stdin);
freopen("calendar.out","w",stdout);
memset(f,false,sizeof(f));
for (i=1;i<=22;i+=2) f[2012][12][i]=true;
for (i=23;i<=30;i+=2) f[2012][11][i]=true;
for (i=2;i<=22;i+=2) f[2012][11][i]=true;
for (y=2012;y>=1900;y--) for (m=(y==2012)?10:12;m>=1;m--) for (d=getd(y,m);d>=1;d--)
{
if (d>getd(y,m+1)) f[y][m][d]=!nextday(y,m,d);
else f[y][m][d]=!(nextday(y,m,d) & nextmonth(y,m,d));
}
while ((scanf("%d%d%d",&y,&m,&d))!=EOF)
{
if (f[y][m][d]) printf("YES\n");
else printf("NO\n");
}
return 0;
}