日历游戏

【问题描述】
moreD和moreD的宠物CD正在玩一个日历游戏,开始时,他们从1900年1月1日到2012年12月22日(你懂的……)选一个日期开始,依次按照如下规则之一向后跳日期:
跳到日历上的下一天。
跳到日历上的下个月的同一天(如果不存在,则不能这么做)。
要是谁正好到达2012年12月22日那么他就赢了,如果到达这天之后的日期那他就输了——原因你也懂的。
每次都是moreD先走的。
现在,给你一个日期,请问moreD一定能赢吗?
【输入】
输入共T行,每行三个整数,Y、M、D,分别表示年、月、日。日期在1900年1月1日到2012年12月22日之间(包含两端)。
T并不在输入数据当中。
【输出】
要是moreD一定能赢,输出一行YES,否则输出NO。
【输入输出样例一】
calendar.in calendar.out
2012 12 20 NO
【输入输出样例二】
calendar.in calendar.out
2012 12 21 YES

对于50%的数据,是1949年1月1日后的日期。 T <= 5
对于100%的数据,是1900年1月1日后的日期。T <= 10

这道题代码非常简单,主要说一下思想。刚开始拿到这道题,一直在想什么奇数偶数。。(思路错了。

拿到题冷静地思考一下,这题怎么做。//据说这题有数学方法但我不会。
什么样的情况能赢,什么样的情况不能赢。
2012年12月22日是目标状态。
拿到2012年12月21日一定赢,为什么?因为22号由21号转移来。
拿到2012年11月22号也一定赢。同理。
拿到2012年11月21号一定输——只能把11月22号或12月21号给对手。
所以,我们可以搜索处理出所有情况,赢的节点的父亲就是输的节点。这题就解决了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值