Гра
Останнім часом більшу частину мого часу займає захоплююча гра на моєму телефоні під назвою Logic Dots, яка надихнула мене написати цей виклик. Простіше пояснити правила, якщо я покажу вам дисплей гри, тому ось скріншот невирішеної та вирішеної головоломки:
Зараз тут слід помітити три основні речі.
- Ігрова дошка (4х4 сітка квадратів у центрі)
- Необхідні фігури (пов'язані точки у другому рядку зверху, під шкалою та меню тощо), які є всіма рядками, або
a
на 1 прямокутник - Цифри над рядками та стовпцями, що позначає, скільки крапок має бути у стовпці, для рішення
Мета гри - вписати потрібні фігури в сітку. Ви можете обертати фігури, але вони не можуть входити по діагоналі.
У рішенні зауважте, що всі фігури створюються рівно один раз (адже вони є лише у потрібних формах один раз), і в цьому випадку всі вони є горизонтальними, але вони також можуть бути вертикальними. Рожеві, заповнені квадратами, позначають квадрати, які не використовуються.
Ось більша та трохи складніша сітка:
Зауважте, що у невирішеній головоломці вже кілька квадратів заповнені. Сірі квадрати означають заблоковані квадрати, на яких НЕ МОЖЕТЕ розмістити крапку. Крапки з хвостами говорять вам про те, що крапка знаходиться в цьому місці, і вона посилається на щонайменше ще одну крапку в напрямку хвоста, але не в іншому напрямку (включаючи протилежний напрямок).
Позначення
У решті цієї публікації я буду звертатися до ради, використовуючи такі символи:
- <,>, ^, v - Позначає заздалегідь розміщену крапку з хвостом, що простягається у напрямку точки
- * - Позначає крапку. Якщо подано на невирішеній сітці (вхід), це індивідуальна форма. Якщо у виході, то він підключений до крапок навколо нього.
- # - Позначає заблокований квадрат сітки (де ви не можете розмістити крапку)
- -, | (дефіс і штрих) - Позначте крапку з правого та лівого хвоста та крапку відповідно вгору та вниз хвостом
- ** (пробільний символ) - ** Позначає порожній пробіл
Використовуючи ці символи, останній приклад випадку (невирішений) можна представити наступним чином:
<
#
^ #
І рішення можна представити як:
*< * *
*
*
* *
* *#*
^ # *
Зауважте, що жодна дві форми не може торкатися горизонтально, вертикально або по діагоналі , тому такий випадок недійсний:
***
**
**
Виклик
Ваше завдання - вирішити будь-яку логічну точку головоломки, від 4х4 до 9х9 включно. Ви отримаєте чотири рядки введення, потім ігрову дошку. Рядки будуть такими:
- 1-й рядок, "Фігури" - фігури, які потрібно знайти, кожна з яких подається у формі
sizexquantity
(наприклад,3x2
для двох фігур довжиною три) і розділена пробілом. Приклад рядка:3x1 2x1 1x1
- 2-й рядок, Стовпці - список, розділений пробілом, необхідного підрахунку крапок для кожного стовпця. Приклад рядка:
1 1 2 2
- 3-й рядок, рядки - пробіл, відокремлений пробілом, необхідного підрахунку крапок для кожного рядка. Приклад рядка:
3 0 3 0
- 4-й рядок, Розмір дошки - Одне ціле число, розмір плати,
B
Потім надається дошка та є B
рядки введення, що представляють дошку, використовуючи зазначені вище позначення. Наприклад, повний вхід для останнього прикладу є таким:
4x1 3x1 2x2 1x2
1 4 0 3 0 5
4 1 1 2 3 2
6
<
#
^ #
Тоді ваша програма виведе вирішену дошку в тій же нотації. Відповідний вихід для вищевказаного входу такий:
** * *
*
*
* *
* *#*
* # *
Зауважте, що ігрова дошка може мати декілька рішень. У цьому випадку просто виведіть одне дійсне рішення. Крім того, ваша програма повинна вивести правильне рішення протягом 10 секунд на розумному настільному комп’ютері для складної сітки 10х10.
Це код гольфу, тому виграє найменше байт.
Випробування
Введення 1
3x2 1x4
2 2 3 1 2
4 0 3 0 3
5
#
#
*
Вихід 1
*** *
***#
#
* * *
Введення 2
3x1 1x6
2 0 4 0 3
3 1 2 1 2
5
*
#
Вихід 2
* * *
*
* *
* #
* *
Введення 3
5x1 4x1 2x1 1x2
1 2 3 3 2 2
0 5 0 4 0 4
6
#
-
#
<
Вихід 3
#
*****
****
#
* ** *
t no two shapes can touch horizontally, vertically or diagonally
(це має бути на початку, не втрачено майже в кінці, але все одно ...)