hdu1079

这题就是2001 11 4为先手必败态,然后进行dfs暴力转移,sg数组并不是sg函数值= =。网上还有其他解法,就是利用奇偶性,只有9.30,11.30是不改变奇偶性地,其他都改变。那个貌似几行代码就写完了。、、、我还是太菜了想不到。
#include<cstdio>
#include<cstring>

int y,m,d;
int day[410];
int sg[110][13][32];
int mm[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

void prework()
{
	memset(sg,-1,sizeof(sg));
	for(int i=1900;i<=2001;i++)
	if(i%4==0 && i%100!=0 || i%400==0)
		day[i-1900+1]=29;
	else
		day[i-1900+1]=28;
	sg[101][11][4]=0;
	for(int i=5;i<=mm[11];i++)
		sg[101][12][i]=1;
	for(int i=1;i<=mm[12];i++)
		sg[101][12][i]=1;
}

int g(int y,int m,int d)
{
	if(sg[y][m][d]!=-1) return sg[y][m][d];
	int flag=0;
	if(y>101) return sg[y][m][d]=0;
	if(m==2 && d==day[y] || m<12 && mm[m]==d && mm[m+1]>=d)
	{
		int a=g(y,m+1,d),b=g(y,m+1,1);
		if(a==0 || b==0)
			return sg[y][m][d]=1;
		else
			return sg[y][m][d]=0;
	}
	else
	if(m<12 && mm[m]==d && mm[m+1]<d)
	{
		int a=g(y,m+1,1);
		if(a==0) 
			return sg[y][m][d]=1;
		else
			return sg[y][m][d]=0;
	}
	else
	if(m==2 && d<day[y] || m<12 && d<mm[m])
	{
		int a=g(y,m,d+1),b=g(y,m+1,d);
		if(a==0 || b==0)
			return sg[y][m][d]=1;
		else
			return sg[y][m][d]=0;
	}
	else
	if(m==12 && d<mm[12])
	{
		int a=g(y,m,d+1),b=g(y+1,1,d);
		if(a==0 || b==0)
			return sg[y][m][d]=1;
		else
			return sg[y][m][d]=0;
	}
	else
	if(m==12 && d==mm[12])
	{
		int a=g(y+1,1,1),b=g(y+1,1,d);
		if(a==0 || b==0) 
			return sg[y][m][d]=1;
		else
			return sg[y][m][d]=0;
	}
}

int main()
{
	int t;
	prework();
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%d",&y,&m,&d);
		y-=1900;
		g(y,m,d);
		if(sg[y][m][d]==1)
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值