HDU 1079 简单博弈

判断下一步能否到达必胜态,如果可以当前状态就是必败态,否则当前状态记为必胜态

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace std;
 5 bool p[115][13][40];
 6 int month[13] = {0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31};
 7 
 8 struct Date{
 9     int y , m , d;
10     Date(int y=0 , int m=0 , int d=0):y(y),m(m),d(d){}
11 };
12 
13 bool run(int y)
14 {
15     return y%400 == 0 || (y%4 == 0 && y%100 != 0);
16 }
17 
18 bool ok(int y , int m , int d)
19 {
20     if(run(y)) month[2]=29;
21     bool flag;
22     if(d > month[m]) flag = false;
23     else flag = true;
24     month[2] = 28;
25     return flag;
26 }
27 
28 Date getLastDay(int y , int m , int d)
29 {
30     Date tmp;
31     tmp.y = y , tmp.m = m , tmp.d =d;
32     if(run(y)) month[2]=29;
33     if(d == 1){
34         if(m == 1){
35             tmp.y--;
36             tmp.d=31 , tmp.m =12;
37         }else{
38             tmp.m--;
39             tmp.d = month[tmp.m];
40         }
41     }
42     else tmp.d--;
43     month[2] = 28;
44     return tmp;
45 }
46 
47 Date get_next_month(int y , int m , int d)
48 {
49     Date tmp;
50     tmp.y = y , tmp.m = m , tmp.d =d;
51     if(m == 12) tmp.m=1 , tmp.y+=1;
52     else tmp.m+=1;
53     return tmp;
54 }
55 
56 void init()
57 {
58     memset(p , 0 , sizeof(p));
59     p[101][11][4] = true;
60     Date cur = Date(2001 , 11 , 4);
61     while(1){
62         Date la = getLastDay(cur.y , cur.m , cur.d);
63 
64         Date next_month = get_next_month(la.y , la.m , la.d);
65         bool p1 = p[cur.y-1900][cur.m][cur.d];
66         bool p2 = false;
67 
68         if(ok(next_month.y , next_month.m , next_month.d))
69             p2 = p[next_month.y-1900][next_month.m][next_month.d];
70         if(p1 || p2) p[la.y-1900][la.m][la.d] = false;
71         else p[la.y-1900][la.m][la.d] = true;
72 
73         cur.y = la.y , cur.m = la.m , cur.d = la.d;
74         if(cur.y == 1900 && cur.m == 1 && cur.d == 1) break;
75     }
76 }
77 
78 int main()
79 {
80   //  freopen("a.in" , "r" , stdin);
81     int T;
82     scanf("%d" , &T);
83     init();
84 
85     while(T--)
86     {
87         int y , m ,d;
88         scanf("%d%d%d" , &y , &m , &d);
89 
90         if(p[y-1900][m][d]) puts("NO");
91         else puts("YES");
92     }
93     return 0;
94 }
原文地址:https://www.cnblogs.com/CSU3901130321/p/4248344.html