Рассмотрим прямоугольную двумерную сетку, где каждая ячейка может быть пустой ( .
) или полной ( 0
).
например
..00....
0000....
.00000..
000...00
..000000
000.00..
Сетка считается бесконечной, все ячейки за пределами изображенной области пусты.
Цель состоит в том, чтобы покрыть заполненные пространства и оставить пустые пространства открытыми, используя набор из 7 кирпичей четкой формы, каждая из которых занимает 4 ячейки (2 × 2) сетки.
Это 7 кирпичей:
Блоки - 1 вариант
11 11
Плиты - 2 варианта
.. 22
33 ..
Лестница - 4 варианта
.4 44
5. 55
66 .6
77 7.
Эти кубики всегда должны быть выровнены по сетке, ячейки которой в два раза шире и выше, чем ячейки входной сетки. Каждый кирпич может занимать только одну ячейку этой более крупной сетки, но меньшую сетку можно перевести (сдвинуть вверх, вниз, влево, вправо) под большую сетку, чтобы предоставить больше возможностей для поиска укрытия. Ни сетки, ни отдельные кирпичи не могут вращаться.
Итак, один из способов покрыть (иначе решить) приведенный выше пример выглядит так:
..11....
2211....
.47733..
447...22
..771133
227.11..
(Идентичные соседние кирпичи могут все еще вызывать неоднозначность, но тщательная идентификация большей сетки решает это.)
Недействительным решение
000000
000000
является
566774
556744
потому что кирпичи не все совпадают с большей сеткой и не занимают только одну ее ячейку.
Действительное решение здесь - 3 блока подряд:
111111
111111
И еще одно правильное решение включает 6 плит:
......
222222
333333
......
Обратите внимание, что некоторые входные сетки имеют несколько решений .
Недействительным решение
00.00
00...
является
11.33
11...
потому что кирпичи не совпадают с большей сеткой. Плита должна двигаться влево или вправо, но тогда, конечно, покрытие будет неполным. Эта входная сетка имеет имеет решения .
Вызов
Напишите программу, которая принимает (через стандартный ввод / командную строку) прямоугольный блок текста .
's и0
', который представляет сетку, которую нужно покрыть.
Если есть правильное решение покрытие, печать (через стандартный вывод) любое одно решение таким же образом , как указано выше, заменив все 0
«S с соответствующим 1
сквозным7
кирпичи.
Если решения не существует, ваша программа не должна ничего выводить, просто спокойно заканчивается нормально.
Примечания
Вход и выход не обязательно должны иметь одинаковые прямоугольные размеры. Ваш вывод может иметь посторонние строки и / или столбцы всех
.
(если они не делают решение недействительным).Также можно обрезать строки и столбцы всех
.
, если это не повлияет на заполненные пробелы. например222222 333333
является действительным решением для
000000 000000
И наоборот, два пустых столбца в
00..00
не могут быть удалены, так как это нарушит заполненные пробелы.При желании вы можете предположить, что вход имеет одну завершающую новую строку. Одиночный трейлинг-перевод строки в выводе также хорош, даже в случае отсутствия решения.
Полностью пустые (все
.
) сетки и тривиальная сетка 0 × 0 не являются входными данными, о которых вам нужно беспокоиться. Но0
сетка 1 × 1 , как и все другие сетки, содержит хотя бы одну сетку0
. (Вы не можете предполагать, что ширина или высота входной сетки четна!)Вместо программы вы можете написать функцию, которая принимает входные данные в качестве строкового аргумента и обычно печатает выходные данные или возвращает их в виде строки. Любое ложное значение может быть возвращено, если нет решения.
Вы можете использовать любые 9 различных печатаемых символов ASCII вместо
.
0
1
2
3
4
5
6
7
. Просто обязательно скажи, какие у тебя были замены! Новые строки должны оставаться как есть.
счет
Самый короткий код в байтах побеждает. Tiebreaker является самым высоко оцененным постом.
Эта задача была вдохновлена блоками , плитами и лестницами в Minecraft , которые следуют тем же правилам, что и здесь. Если вам нравятся PPCG и Minecraft, вы можете проверить PPCG Minecraft Server .