Городская стена: покраска без «перекоса»

тема: Конструктив · уровень: средний

Условие

В городе чинят старую кирпичную стену. Её разбили на прямоугольную сетку из m рядов и n колонок. Каждый кирпич нужно покрасить в один из двух цветов:

Архитектор требует, чтобы в каждом квадратике 2×2 (то есть для любых соседних двух рядов и двух колонок) было ровно два кирпича цвета B и ровно два цвета W.

Возможных раскрасок может быть много, поэтому город просит вывести лексикографически минимальную среди всех подходящих: сравниваются строки по порядку, а если склеить все строки сверху вниз в одну длинную строку, она должна быть минимальной (считайте, что B < W).

Формат ввода

Два целых числа m и n.

Формат вывода

Выведите m строк по n символов в каждой — только B и W — так, чтобы выполнялось условие про каждый блок 2×2, и раскраска была лексикографически минимальной.

Ограничения

Пример

Ввод:

3 4

Вывод:

BBBB
WWWW
BBBB

Как решать — идея подхода

Приём: Конструктив + жадный выбор по лексикографическому минимуму

Ключевое наблюдение: лексикографический минимум (при B < W) требует, чтобы как можно раньше стояли B. Значит, первая строка должна быть минимально возможной — это строка из одних B.

Почему это работает: если m >= 2 и n >= 2, то условие «в каждом 2×2 ровно 2 B и 2 W» жёстко фиксирует следующую строку. Посмотрим на любой блок 2×2, где верхние две клетки — B B. Чтобы всего было ровно две B, нижние две клетки обязаны быть W W. Это верно для каждой пары соседних столбцов, значит вторая строка целиком становится из W. Дальше аналогично: под строкой из W обязана идти строка из B, и так до конца.

План:

Сложность: O(m*n) на вывод.

Частая ошибка: забыть случай m == 1 или n == 1 и пытаться «вынуждать» вторую строку, хотя блоков 2×2 просто не существует.

Решить задачу с автопроверкой на Python →

Куда дальше