首页 > 代码库 > NOIp模拟2 日历游戏

NOIp模拟2 日历游戏

试题描述

moreD和moreD的宠物CD正在玩一个日历游戏,开始时,他们从1900年1月1日到2012年12月22日(你懂的……)选一个日期开始,依次按照如下规则之一向后跳日期:
1. 跳到日历上的下一天。
2. 跳到日历上的下个月的同一天(如果不存在,则不能这么做)。
要是谁正好到达2012年12月22日那么他就赢了,如果到达这天之后的日期那他就输了——原因你也懂的。
每次都是moreD先走的。
现在,给你一个日期,请问moreD一定能赢吗?

输入格式

输入共T行,每行三个整数,Y、M、D,分别表示年、月、日。日期在1900年1月1日到2012年12月22日之间(包含两端)。
T并不在输入数据当中。

输出格式

要是moreD一定能赢,输出一行YES,否则输出NO。

输入示例

输入样例1:
2012 12 20

输入样例2:
2012 12 21

输出示例

输出样例1:
NO

输出样例2:
YES

注释说明

对于50%的数据,是1949年1月1日后的日期。 T <= 5
对于100%的数据,是1900年1月1日后的日期。T <= 10

 

【分析】

和之前有一题完全一样,为了保证做过的模拟题被完整记录下来还是发出来好了(才不是凑篇数)。

传送门:http://www.cnblogs.com/shamman/p/7336677.html

 

【代码】

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int t, a, b, c, x, y, z;
 5 int f[2015][15][35];
 6 int m[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 7 
 8 int fun(int a) {
 9     return (a%400==0 || (a%4==0 && a%100));
10 }
11 
12 bool check(int x, int y, int z) {
13     if (x>2012)
14         return false;
15     if (x==2012 && y==12 && z>22)
16         return false;
17     return true;
18 }
19 
20 void get1(int &x, int &y, int &z) {
21     int maxx=m[y];
22     if (y==2)
23         maxx+=fun(x);
24     if (z>maxx)
25         y++, z-=maxx;
26     if (y>12)
27         x++, y=1;
28     return;
29 }
30 
31 void get2(int &x, int &y, int &z) {
32     if (y>12)
33         x++, y=1;
34     int maxx=m[y];
35     if (y==2)
36         maxx+=fun(x);
37     if (z>maxx) {
38         x=2013;
39         return;
40     }
41     return;
42 }
43 
44 int dfs(int a, int b, int c) {
45     if (a==2012 && b==12 && c==22)
46         return f[a][b][c]=0;
47     if (f[a][b][c]!=-1)
48         return f[a][b][c];
49     if (!check(a, b, c))
50         return f[a][b][c]=1;
51     x=a, y=b, z=c;
52     z++; get1(x, y, z);
53     if (!dfs(x, y, z))
54         return f[a][b][c]=1;
55     x=a, y=b, z=c;
56     y++; get2(x, y, z);
57     if (!dfs(x, y, z))
58         return f[a][b][c]=1;
59     return f[a][b][c]=0;
60 }
61 
62 int main() {
63     memset(f, -1, sizeof(f));
64     while(cin >> a >> b >> c) {
65         if (!check(a, b, c)) {
66             cout << "NO" << endl;
67             continue;
68         }
69         if (f[a][b][c]==-1)
70             dfs(a, b, c);
71         if (f[a][b][c]==1)
72             cout << "YES" << endl;
73         else
74             cout << "NO" << endl;
75     }
76 }

 

NOIp模拟2 日历游戏