#include <bits/stdc++.h>
using namespace std;
const int p[14]={0,31,29,31,30,31,30,31,31,30,31,30,31,31};
bool f[2020][13][32];
bool vis[2020][13][32];
inline bool check(int y,int m,int d){
if(d>p[m]) d=1,++m;
if(m>12) m=1,++y;
if(y>2016) return false;
if(y==2016&&m>11) return false;
if(y==2016&&m==11&&d>4) return false;
if((y%4!=0||y==1900)&&m==2&&d>28) return false;
return true;
}
inline bool dfs(int y,int m,int d){
if(d>p[m]){
d=1;++m;
}
if(m>12){
m=1,++y;
}
if(y==2016&&m==11&&d==4) return false;
if(vis[y][m][d]) return f[y][m][d];
vis[y][m][d] = true;
if(d<=p[m+1]) if(check(y,m+1,d))f[y][m][d] |= dfs(y,m+1,d)^1;
if(check(y,m,d+1)) f[y][m][d] |= dfs(y,m,d+1)^1;
return f[y][m][d];
}
int main(){
dfs(1900,1,1);
int n;
cin>>n;
while(n--){
int y,m,d;
cin>>y>>m>>d;
printf("%s\n",f[y][m][d]?"YES":"NO");
}
return 0;
}
中的
if(y==2016&&m==11&&d==4) return false;
if(vis[y][m][d]) return f[y][m][d];
vis[y][m][d] = true;
if(d<=p[m+1]) if(check(y,m+1,d))f[y][m][d] |= dfs(y,m+1,d)^1;
if(check(y,m,d+1)) f[y][m][d] |= dfs(y,m,d+1)^1;
return f[y][m][d];
这一段的位运算,看不太懂