ZJUT 1587 日期滚动条 (博弈)

题目链接:http://acm.zjut.edu.cn/onlinejudge/problem.php?id=1587


题面:

1587: 日期滚动条

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 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;
}


你可能感兴趣的:(模拟,博弈,zjut)