Лаба №6C. Лабораторная работа 1 [Вариант 12]

Вариант: 
12
Решение

 #include <fstream>
#include <iostream>

using namespace std;

bool isCorrect(int day, int month, int *dates)
{
if (month < 0 || month > 11)
return false;
if (day < 0 || day > dates[month]-1)
return false;
return true;
}

int main()
{
int dates[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
bool wins[31][12];
int day = 0;
int month = 0;
ifstream in("dategame.in");
in >> day >> month;
in.close();
for (int i = 11; i >= 0; --i)
for (int j = dates[i]-1; j >= 0; --j)
if (j != 30 || month != 11)
{
wins[j][i] = false;
if (isCorrect(j+1, i, dates))
if (!wins[j+1][i])
wins[j][i] = true;
if (isCorrect(j+2, i, dates))
if (!wins[j+2][i])
wins[j][i] = true;
if (isCorrect(j, i+1, dates))
if (!wins[j][i+1])
wins[j][i] = true;
if (isCorrect(j, i+2, dates))
if (!wins[j][i+2])
wins[j][i] = true;
}
/* for (int i = 0; i < 12; ++i)
{
for (int j = 0; j < dates[i]; ++j)
{
cout << (wins[j][i] ? 1 : 2) << (day == j+1 && month == i+1 ? "<" : " ");
}
cout << endl;
} */
ofstream out("dategame.out");
if (wins[day-1][month-1])
out << 1 << endl;
else
out << 2 << endl;
out.close();
return 0;
}
 

Задание

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

Ввод из файла dategame.in. В первой строке находятся числа, обозначающие день и месяц.
Вывод в файл dategame.out. Вывести 1, если выигрывает первый (начинающий) игрок, или 2 - в противном случае.

Комментарии

// Есть алгоритм по-круче, банально, но работает! проверь!
// Каюсь, не знал про iostream тогда=)
#include
#include

bool baddate(int,int);
bool Winner(int,int);

void main()
{
FILE *stream;

if ((stream=freopen("dategame.in", "r", stdin)) == NULL)
{
printf("File 'dategame.in' can not be open.\n");
exit(1);
}
int day=1, month=1;
scanf("%d %d",&day,&month);
fclose(stream);

if (baddate(day,month) == true)
{
puts("Wrong date");
return;
}

if ((stream=freopen("dategame.out", "w", stdout)) == NULL)
{
printf("File 'dategame.out' can not be open.\n");
exit(1);
}
printf("\nPlayer #%d will win!",(1+Winner(day,month)));
fclose(stream);
}

bool baddate(int day, int month)
{
if ((day*month < 1)|| // Число или Месяц < 1
(month>12)|| // Месяц > 12
(day>31)|| // Число > 31
(day>30)&&(((month%7)%2) == 0)|| // Число > 30 в некоторые месяцы
((month==2)&&(day==30))|| // 30 Февраля
((month==12)&&(day==31)))
return true;
else return false;
}

bool Winner(int day, int month)
{
if (((day%3 == 0) && (month%2 == 0))||
((day%3 != 0) && (month%2 != 0)))
return true;
else return false;
}