Календарь
Ограничения: время – 2s/4s, память – 64MiB Ввод: input.txt или стандартный ввод Вывод: output.txt или стандартный вывод
Послать решение Blockly Посылки Темы Где Обсудить (0)
Неудовлетворенный стандартным календарем своей операционной
системы, Витя решил написать программу, которая будет
выводить красиво отформатированный календарь. Он разработал
формальные требования к календарю, но понял, что сам
не способен написать соответствующую программу. Помогите ему.
Календарь состоит из блоков, каждый из которых соответствует
одному месяцу. Блоки расположены в виде таблицы из `k` столбцов
и `12/k` строк (`k` выбирается делителем числа 12).
Месяцы выводятся в следующем порядке:
первая строка содержит блоки, соответствующие месяцам
с первого по `k`-ый, следующая — с `(k\ +\ 1)`-го по `2k`-ый, и т. д.
Ширина всех блоков в столбце должна быть одинакова,
высота всех блоков равна семи (числу дней в неделе).
Между блоками различных строк таблицы выводится пустая строка,
в каждой строке между соседними блоками из разных столбцов
выводится три пробела.
Блок, соответствующий месяцу, устроен следующим образом.
Каждой (в том числе неполной) неделе данного месяца
в блоке соответствует столбец, имеющий ширину
равную двум. Между двумя соседними столбцами в каждой строке
выводится один пробел. Если несколько блоков располагаются
в одном столбце в календаре, то для выравнивания ширины
в те блоки, которые содержат меньше недель, в конец добавляется
необходимое число пустых столбцов-недель. При этом разные
столбцы календаря могут иметь разную ширину.
Все числа месяца заносятся в блок, соответствующий этому месяцу.
Число заносится в ту строку блока, которая соответствует
дню недели, на который приходится число в этом месяце.
Число заносится в столбец блока, соответствующий неделе,
в которой находится данное число. Однозначные числа дополняются
слева одним пробелом. Таким образом, числа в столбце
оказываются выравнены по правому краю.
Ввод
Входной файл содержит описание года, календарь для
которого следует вывести — три числа: `d` — день недели,
на который приходится первое января (`1\ ≤\ d\ ≤\ 7`),
`l` — является ли год високосным (`l\ =\ 1` означает,
что год является високосными, `l\ =\ 0` — что не является)
и `k` — количество столбцов в календаре
(`k` — одно из чисел `1,\ 2,\ 3,\ 4,\ 6,\ 12`).
Напомним, что високосный год отличается от обычного тем, что
в високосном году февраль содержит 29 дней.
Вывод
Выведите календарь, отформатированный как описано в условии задачи.
Проверяющая программа в этой задаче игнорирует пробелы в конце строк.
В остальном календарь должен быть отформатирован в точности в
соответствии с условием.
Для наглядности в примере вместо пробелов выведены точки.
Ваша программа должна выводить пробелы.
Пример вывода
....5.12.19.26..........2..9.16.23....1..8.15.22.29.......5.12.19.26...
....6.13.20.27..........3.10.17.24....2..9.16.23.30.......6.13.20.27...
....7.14.21.28..........4.11.18.25....3.10.17.24.31.......7.14.21.28...
.1..8.15.22.29..........5.12.19.26....4.11.18.25.......1..8.15.22.29...
.2..9.16.23.30..........6.13.20.27....5.12.19.26.......2..9.16.23.30...
.3.10.17.24.31..........7.14.21.28....6.13.20.27.......3.10.17.24......
.4.11.18.25..........1..8.15.22.29....7.14.21.28.......4.11.18.25......
.......................................................................
....3.10.17.24.31.......7.14.21.28.......5.12.19.26.......2..9.16.23.30
....4.11.18.25.......1..8.15.22.29.......6.13.20.27.......3.10.17.24.31
....5.12.19.26.......2..9.16.23.30.......7.14.21.28.......4.11.18.25...
....6.13.20.27.......3.10.17.24.......1..8.15.22.29.......5.12.19.26...
....7.14.21.28.......4.11.18.25.......2..9.16.23.30.......6.13.20.27...
.1..8.15.22.29.......5.12.19.26.......3.10.17.24.31.......7.14.21.28...
.2..9.16.23.30.......6.13.20.27.......4.11.18.25.......1..8.15.22.29...
.......................................................................
....6.13.20.27..........4.11.18.25....1..8.15.22.29.......6.13.20.27...
....7.14.21.28..........5.12.19.26....2..9.16.23.30.......7.14.21.28...
.1..8.15.22.29..........6.13.20.27....3.10.17.24.......1..8.15.22.29...
.2..9.16.23.30..........7.14.21.28....4.11.18.25.......2..9.16.23.30...
.3.10.17.24..........1..8.15.22.29....5.12.19.26.......3.10.17.24.31...
.4.11.18.25..........2..9.16.23.30....6.13.20.27.......4.11.18.25......
.5.12.19.26..........3.10.17.24.31....7.14.21.28.......5.12.19.26......
Источник: V Всероссийская командная олимпиада школьников по программированию, 2004