每天两道acm 题解 (具体参考ACM国际大学生程序设计竞赛题解)

zoj 1024


#include<stdio.h>

#include<memory.h>  


//亚当每天的输赢
int isWin[102][13][32];
//每个月最多的天数
int maxDay[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};


//判断输赢
int judge(int y,int m, int d)
{
    int win; //输赢


    //递归结束条件
    //夏娃将日期变过头
    if(y>101||(y==101&&(m>11||(m==11&&d>4)))) return 1;
    //夏娃已经成功
    if(y==101&&m==1&&d==4) return 0;


    //把这一天亚当的输赢计算出来
    if(isWin[y][m][d]==-1)
    {
        //首先改变月份
        win = 0;
        if(m!=12)   //如果不是12月
        {
            //下个月有同一天或者闰年
            if(d<=maxDay[m+1]||(d==29&&m==1&&(y%4)==0&&y!=0))
                if(judge(y,m+1,d)==0) win = 1;
        }
        //如果是12月,明年一月份的同一天
        else if(judge(y+1,m,d)==0)  win = 1;
        //如果改变月份还没有获胜,接着改变日期
        if(win==0)
        {
            if(d<maxDay[m])
                win = 1-(judge(y,m,d+1));
            else if(m!=12)
                win = 1-(judge(y,m+1,d));
            else
                win = 1- (judge(y+1,m,d));
        }
        isWin[y][m][d] = win;
    }
    return isWin[y][m][d];
}


int main()
{
    int iCase;
    int m,d,y;
    //只要进行一次初始化,每次计算结果都是有用的
    memset(isWin,255,sizeof(isWin));
    scanf("%d",&iCase);
    while(iCase--){
        scanf("%d%d%d",&y,&m,&d);
        if(judge(y-1900,m,d)==1)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值