题目链接:http://acm.zjut.edu.cn/onlinejudge/problem.php?id=1587
题面:
1587: 日期滚动条
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 20 Solved: 4
[ Submit][ Status][ Web Board]
Description
一日,小安琪和小林通闲的发闷,玩起了无聊的游戏
游戏一开始给出一个日期,小安琪先,和小林通轮流操作.
每次可以把这个日期向后移动一天或者一个月或者一年,移动到的日期必须合法.
谁把日期移到超过今天的日期(2015.9.16)就输了~
Input
多组样例(Case<=250)
每组样例一行,三个数字Y,M,D,分别表示年,月,日.输入的日期不会超过2015.9.16.
Output
如果小安琪有必胜策略,输出Mzhq
否则输出Lint
Sample Input
2015 9 16
2015 9 15
Sample Output
Lint
Mzhq
题目大意:
给定一个初始日期,Mzhq和Lint轮流操作,可以日移,月移,年移。问谁先移到指定日期便获胜,若超出该日期,则输。
解题:
和这道题基本一样,只是加了年移操作。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
#define eps 1e-7
using namespace std;
struct date
{
int y,m,d;
};
bool status[2016][13][32],flag,sign;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
date next_day(int y,int m,int d)
{
date tmp;
if(m==12)
{
if(d==31)
tmp.y=y+1,tmp.m=1,tmp.d=1;
else
tmp.y=y,tmp.m=12,tmp.d=d+1;
}
else if(m!=2)
{
if(d==month[m])
tmp.y=y,tmp.m=m+1,tmp.d=1;
else
tmp.y=y,tmp.m=m,tmp.d=d+1;
}
else
{
if(y%400==0||(y%4==0&&y%100!=0))
{
if(d==29)
tmp.y=y,tmp.m=3,tmp.d=1;
else
tmp.y=y,tmp.m=2,tmp.d=d+1;
}
else
{
if(d==28)
tmp.y=y,tmp.m=3,tmp.d=1;
else
tmp.y=y,tmp.m=2,tmp.d=d+1;
}
}
return tmp;
}
date next_month(int y,int m,int d)
{
date tmp;
flag=true;
if(m==12)
tmp.y=y+1,tmp.m=1,tmp.d=d;
else if((m!=2)&&(m!=1))
{
if(d>month[m+1])
flag=false;
else
tmp.y=y,tmp.m=m+1,tmp.d=d;
}
else if(m==1)
{
if((y%4==0&&y%100!=0)||(y%400==0))
{
if(d>29)
flag=false;
else
tmp.y=y,tmp.m=2,tmp.d=d;
}
else
{
if(d>28)
flag=false;
else
tmp.y=y,tmp.m=2,tmp.d=d;
}
}
else
tmp.y=y,tmp.m=m+1,tmp.d=d;
return tmp;
}
date next_year(int y,int m,int d)
{
sign=true;
date tmp;
if(m==2&&d==29)
sign=false;
else
tmp.y=y+1,tmp.m=m,tmp.d=d;
return tmp;
}
int main()
{
date tmp;
for(int i=1;i<=16;i++)
{
if(i%2)
status[2015][9][i]=0;
else
status[2015][9][i]=1;
}
for(int i=31;i>=17;i--)
{
tmp=next_day(2015,8,i);
if(status[tmp.y][tmp.m][tmp.d])
status[2015][8][i]=0;
else
status[2015][8][i]=1;
}
for(int i=16;i>=1;i--)
{
tmp=next_day(2015,8,i);
if(status[2015][tmp.m][tmp.d]||status[2015][9][i])
status[2015][8][i]=0;
else
status[2015][8][i]=1;
}
for(int i=7;i>=1;i--)
{
for(int j=month[i];j>=1;j--)
{
tmp=next_day(2015,i,j);
if(status[tmp.y][tmp.m][tmp.d])
status[2015][i][j]=0;
else
{
tmp=next_month(2015,i,j);
if(flag)
{
if(status[tmp.y][tmp.m][tmp.d])
status[2015][i][j]=0;
else
status[2015][i][j]=1;
}
else
status[2015][i][j]=1;
}
}
}
for(int i=2014;i>=1;i--)
{
for(int j=12;j>=1;j--)
{
int k;
if(j==2&&(i%4==0&&i%100!=0)||(i%400==0))
k=29;
else
k=month[j];
for(;k>=1;k--)
{
tmp=next_day(i,j,k);
if(status[tmp.y][tmp.m][tmp.d])
status[i][j][k]=0;
else
{
tmp=next_month(i,j,k);
if(flag)
{
if(status[tmp.y][tmp.m][tmp.d])
status[i][j][k]=0;
else
{
tmp=next_year(i,j,k);
if(sign)
{
if(status[tmp.y][tmp.m][tmp.d])
status[i][j][k]=0;
else
status[i][j][k]=1;
}
else
status[i][j][k]=1;
}
}
else
{
tmp=next_year(i,j,k);
if(sign)
{
if(status[tmp.y][tmp.m][tmp.d])
status[i][j][k]=0;
else
status[i][j][k]=1;
}
else
status[i][j][k]=1;
}
}
}
}
}
int yy,mm,dd;
while(cin>>yy>>mm>>dd)
{
if(status[yy][mm][dd])
cout<<"Lint\n";
else
cout<<"Mzhq\n";
}
return 0;
}