HDU 1079

题意略。

思路:dfs记忆化搜索即可。

#include<bits/stdc++.h>
using namespace std;

int sg[2005][15][35];
int month_len[2][20];

bool is_leap(int y){
    return (y % 400 || (y % 4 == 0 && y % 100 != 0));
}
int dfs(int y,int m,int d){
    if(sg[y][m][d] != -1) return sg[y][m][d];
    if(y > 2001 || (y == 2001 && m > 11) || 
    (y == 2001 && m == 11 && d > 4)) return 1;
    bool signal = false;
    if(d <= month_len[is_leap(y)][m % 12 + 1]) signal = true;
    int a = 1,b = 1;
    
    int ny1 = y,nm1 = m,nd1 = d,ny2 = y,nm2 = m,nd2 = d;
    if(d < month_len[is_leap(y)][m]) nd1 = d + 1;
    else if(m < 12){
        nm1 += 1;
        nd1 = 1;
    }
    else{
        ny1 += 1;
        nm1 = 1;
        nd1 = 1;
    }
    a = dfs(ny1,nm1,nd1);
    
    if(signal){
        if(m < 12){
            nm2 += 1;
        }
        else{
            ny2 += 1;
            nm2 = 1;
        }
        b = dfs(ny2,nm2,nd2);
    }
    
    return sg[y][m][d] = !(a & b);
}

int main(){
    month_len[0][1] = month_len[1][1] = 31;
    month_len[0][2] = 28,month_len[1][2] = 29;
    month_len[0][3] = month_len[1][3] = 31;
    month_len[0][4] = month_len[1][4] = 30;
    month_len[0][5] = month_len[1][5] = 31;
    month_len[0][6] = month_len[1][6] = 30;
    month_len[0][7] = month_len[1][7] = 31;
    month_len[0][8] = month_len[1][8] = 31;
    month_len[0][9] = month_len[1][9] = 30;
    month_len[0][10] = month_len[1][10] = 31;
    month_len[0][11] = month_len[1][11] = 30;
    month_len[0][12] = month_len[1][12] = 31;
    memset(sg,-1,sizeof(sg));
    sg[2001][11][4] = 0;
    int T;
    scanf("%d",&T);
    while(T--){
        int y,m,d;
        scanf("%d%d%d",&y,&m,&d);
        int ans = dfs(y,m,d);
        printf("%s\n",ans ? "YES" : "NO");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/tiberius/p/9350467.html