Решение задачи "Игра \"Даты\" с Меньшиков

Без пояснения   Просмотров: 34


Играют двое. Задаётся какая-то дата 2020 года. Каждый игрок на своём ходе называет более позднюю дату, увеличивая на 1 или 2 либо день в месяце, либо месяц, но не то и другое сразу. При этом сочетание дня и месяца должно оставаться датой. Игрок, назвавший 31 декабря, проигрывает. Оба играют наилучшим образом. Исходя из заданной даты вывести, кто выиграет.

Код

#include <iostream>
#include <cstdio>
#include <vector>
#include <string.h>
 
using namespace std;
 
bool isWin[32][13];
int day,mon;
void input()
{
    cin>>day>>mon;
}
inline bool equal(int* a, int *b)
{
    return a[0] == b[0] && a[1] == b[1];
}
int days[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
bool isCorrectDate(int* d)
{
    return d[1] < 13 && days[d[1]] >= d[0];
}
void DecDay(int* cur)
{
    cur[0]--;
    if (cur[0] == 0)
    {
        cur[1]--;
        cur[0] = days[cur[1]];
    }
}
void solve()
{
    isWin[31][12] = true;
 
    int cur[2]   = {31,12};
    int begin[2] = {day,mon};
    do
    {
        DecDay(cur);
        int next[2];
        bool isCurWin = false;
        for (int i=0;i<2;i++)
        {
            memcpy(next,cur,2*sizeof(int));
            for (int j=1; j<=2; j++)
            {
                next[i] = cur[i] + j;
                if (isCorrectDate(next))
                    if (!isWin[next[0]][next[1]])
                        isCurWin = true;
            }
        }
        isWin[cur[0]][cur[1]] = isCurWin;
 
    } while (!equal(cur,begin));
}
void output()
{
    if (isWin[day][mon])
        cout<<1;
    else
        cout<<2;
}
int main()
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
 
    input();
    solve();
    output();
    return 0;
}

         

 Администратор Photo Автор: Администратор


Отправить решение задачи
Чтобы отправить решение вам нужно войти в систему или зарегистрироваться

Комментарии

Чтобы написать комментарии вам нужно войти в систему или зарегистрироваться