首页 > 其他分享 >博弈论练习4 Calendar Game(SG函数)

博弈论练习4 Calendar Game(SG函数)

时间:2022-11-16 15:24:27浏览次数:86  
标签:ty int 31 yy mm Game tm Calendar SG

题目链接在这里: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

相关文章