题意略。
思路: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 ",ans ? "YES" : "NO"); } return 0; }