一日,小安琪和小林通闲的发闷,玩起了无聊的游戏
游戏一开始给出一个日期,小安琪先,和小林通轮流操作.
每次可以把这个日期向后移动一天或者一个月或者一年,移动到的日期必须合法.
谁把日期移到超过今天的日期(2015.9.16)就输了~
题目链接:http://acm.zjut.edu.cn/onlinejudge/problem.php?id=1587
题面:
一日,小安琪和小林通闲的发闷,玩起了无聊的游戏
游戏一开始给出一个日期,小安琪先,和小林通轮流操作.
每次可以把这个日期向后移动一天或者一个月或者一年,移动到的日期必须合法.
谁把日期移到超过今天的日期(2015.9.16)就输了~
多组样例(Case<=250)
每组样例一行,三个数字Y,M,D,分别表示年,月,日.输入的日期不会超过2015.9.16.
如果小安琪有必胜策略,输出Mzhq
否则输出Lint
2015 9 16
2015 9 15
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; }