题目链接在这里:D-Calendar Game_牛客竞赛博弈专题班组合游戏基本概念、对抗搜索、Bash游戏、Nim游戏习题 (nowcoder.com)
这题网上有关于奇偶性来找规律的做法,有点人类智慧,这里就先考虑一种比较传统的sg函数做法。众所周知,sg函数意思是一个状态的胜负性由其后续状态推得,因此这就是一个dfs的过程。考虑到这里有多组数据,因此需要使用记忆化搜索。
1 #include "bits/stdc++.h" 2 using namespace std; 3 int t; 4 int y,m,d; 5 int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 6 int sg[105][13][35]; 7 void ckmon(int year){ 8 year+=1900; 9 if (year%400==0 || (year%100!=0 && year%4==0)) 10 mon[2]=29; 11 else 12 mon[2]=28; 13 } 14 int dfs(int yy,int mm,int dd){ 15 int i,j; 16 if (sg[yy][mm][dd]!=-1) 17 return sg[yy][mm][dd]; 18 if (yy==101 && mm==11 && dd==4) return 0; 19 if (yy>101 || (yy==101 && mm==11 && dd>4)){ 20 return 1; 21 } 22 int ty=yy,tm=mm,td=dd+1; 23 ckmon(ty); 24 if (td>mon[tm]){ 25 tm++; 26 if (tm>12){ 27 ty++; 28 ckmon(ty); 29 tm=1; 30 } 31 td=1; 32 } 33 if (dfs(ty,tm,td)==0) 34 return sg[yy][mm][dd]=1; 35 ty=yy,tm=mm+1,td=dd; 36 if (tm>12){ 37 ty++; 38 ckmon(ty); 39 tm=1; 40 } 41 if (td<=mon[tm]){ 42 if (dfs(ty,tm,td)==0) 43 return sg[yy][mm][dd]=1; 44 } 45 return sg[yy][mm][dd]=0; 46 } 47 int main(){ 48 int i,j; 49 scanf("%d",&t); 50 while (t--){ 51 scanf("%d%d%d",&y,&m,&d); 52 memset(sg,-1,sizeof(sg)); 53 y-=1900; 54 dfs(y,m,d); 55 if (sg[y][m][d]) printf("YES\n"); 56 else printf("NO\n"); 57 } 58 return 0; 59 }
标签:ty,int,31,yy,mm,Game,tm,Calendar,SG From: https://www.cnblogs.com/keximeiruguo/p/16895979.html