【POJ 1082】 Calendar Game

【题目链接】

            http://poj.org/problem?id=1082

【算法】

            对于每种状态,要么必胜,要么必败

            记忆化搜索即可

【代码】

            

#include <algorithm>
#include <bitset>
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <limits>
#include <list>
#include <map>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <utility>
#include <vector>
#include <cwchar>
#include <cwctype>
#include <stack>
#include <limits.h>

using namespace std;

int newy,newm,newd,y,m,d,T;
int f[2005][13][32];
int day[13] = {0,31,0,31,30,31,30,31,31,30,31,30,31};
 
template <typename T> inline void read(T &x) {
    int f = 1; x = 0; char c = getchar();
    for (; !isdigit(c); c = getchar()) { if (c == '-') f = -1; }
    for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
    x *= f;    
}

bool is_leap(int yy) {
    if (((yy % 4 == 0) && (yy % 100 != 0)) || (yy % 400 == 0))
        return true;
    else return false;    
}

bool check(int yy,int mm,int dd) {
    if (is_leap(yy)) day[2] = 29;
    else day[2] = 28;
    if (dd > day[mm]) return false;
    if (yy > 2001) return false;
    if ((yy == 2001) && (mm > 11)) return false;
    if ((yy == 2001) && (mm == 11) && (dd > 4)) return false;
    return true; 
}

void next_day() {
    if (is_leap(newy)) day[2] = 29;
    else day[2] = 28;
    newd++;
    if (newd > day[newm]) { newd = 1; newm++; }
    if (newm > 12) { newm = 1; newy++; }    
}

void next_month() {
    newm++;
    if (newm > 12) { newm = 1; newy++; }    
}

bool dfs(int yy,int mm,int dd) {
    if (f[yy][mm][dd] != -1)
        return f[yy][mm][dd];
    f[yy][mm][dd] = 0;
    newy = yy; newm = mm; newd = dd;
    next_day();
    if (check(newy,newm,newd)) {
        f[yy][mm][dd] |= (!dfs(newy,newm,newd));
        if (f[yy][mm][dd] == 1)
            return true;
    }
    newy = yy; newm = mm; newd = dd;
    next_month();
    if (check(newy,newm,newd)) 
        f[yy][mm][dd] |= (!dfs(newy,newm,newd));
    return f[yy][mm][dd];
}

int main() { 
    
    memset(f,255,sizeof(f));
    f[2001][11][4] = 0;
    read(T);
    
    while (T--) {
        read(y); read(m); read(d);
        puts((dfs(y,m,d))?("YES"):("NO"));    
    }
    
    return 0;
    
}