Розглянемо прямокутну двовимірну сітку, де кожна комірка може бути порожньою ( .
) або повною ( 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...
тому що цеглини не вирівнюються до більшої сітки. Плита повинна рухатися вліво або вправо по одній, але тоді, звичайно, покриття було б неповним. Ця вхідна сітка не має рішення .
Виклик
Напишіть програму, яка містить (через stdin / командний рядок) прямокутний блок тексту .
'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
. Просто не забудьте сказати, якими були ваші заміни! Нові лінії повинні залишатися такими, як є.
Оцінка балів
Виграє найкоротший код у байтах. Tierereaker - це найвище оцінений пост.
Цей виклик був натхненний блоками , плитами та сходами в Minecraft , які дотримуються тих же правил, що описані тут. Якщо ви любите PPCG та Minecraft, ви можете перевірити сервер Minecraft PPCG .