NOIp模拟2 日历游戏
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIp模拟2 日历游戏相关的知识,希望对你有一定的参考价值。
试题描述 |
moreD和moreD的宠物CD正在玩一个日历游戏,开始时,他们从1900年1月1日到2012年12月22日(你懂的……)选一个日期开始,依次按照如下规则之一向后跳日期: |
输入格式 |
输入共T行,每行三个整数,Y、M、D,分别表示年、月、日。日期在1900年1月1日到2012年12月22日之间(包含两端)。 |
输出格式 |
要是moreD一定能赢,输出一行YES,否则输出NO。 |
输入示例 |
输入样例1: |
输出示例 |
输出样例1: |
注释说明 |
对于50%的数据,是1949年1月1日后的日期。 T <= 5 |
【分析】
和之前有一题完全一样,为了保证做过的模拟题被完整记录下来还是发出来好了(才不是凑篇数)。
传送门: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 日历游戏的主要内容,如果未能解决你的问题,请参考以下文章