Уявіть собі такий сценарій: ви граєте в лінкор з другом, але вирішите обдурити. Замість того, щоб пересувати корабель після того, як він стріляє там, де раніше був ваш корабель, ви вирішите взагалі не розміщувати жодне судно. Ви кажете йому, що всі його постріли - це промахи, поки неможливо розмістити кораблі таким чином.
Ви повинні написати функцію або повну програму, яка якось приймає 3 аргументи: розмір поля, список розмірів суден і список пострілів.
Поле битви
Одним із заданих параметрів є розмір плати. Поле бою - це квадрат комірок, а даний параметр - це просто одна сторона квадрата.
Наприклад, наступна дошка розміром 5.
Координати в полі задаються у вигляді двокомпонентного рядка: літера, за якою йде цифра. Ви можете розраховувати на те, що букви в якомусь конкретному випадку.
Буква вказує стовпчик, число вказує рядок комірки (1-індексований). Наприклад, на малюнку, що виділяється, виділена клітина позначається символом "D2"
.
Оскільки буває лише 26 літер, поле не може бути більшим за 26x26.
Кораблі
Кораблі - прямі лінії з 1 або більше блоків. Кількість кораблів визначається у списку, де перший елемент - це кількість одноклітичних кораблів, другий - двоклітинні кораблі тощо.
Наприклад, у списку [4,1,2,0,1]
буде створено наступний комплект суден:
Розміщуючись на полі бою, кораблі не можуть перетинатися або навіть торкатися один одного. Навіть з кутами. Однак вони можуть торкатися країв поля.
Нижче ви можете побачити приклад дійсного розміщення судна:
Можна припустити, що для заданого набору суден завжди існує розміщення на порожній дошці заданого розміру.
Вихідні дані
Якщо такі місця розміщення кораблів існують, ви повинні вивести будь-яке з них.
Програма має вивести матрицю, розділену рядками, символами ascii будь-якого з 3-х типів - один для позначення порожньої комірки, один - шматок судна, а другий - комірка, позначена як "пропущена". Жодних інших символів не слід виводити.
Наприклад,
ZZ@Z
\@@Z
@\\Z
\Z\\
(У цьому прикладі я визначив @
порожню клітинку, \
щоб бути "пропущеною" коміркою та Z
бути частиною судна)
Якщо такого розміщення не існує, програма / функція повинна повертатися, нічого не виводячи.
Вхідні дані
Якщо ви вирішили зробити повноцінну програму, то вам слід вказати, як вводяться списки, деякі можуть перейти через аргументи, інші через stdin.
Це код-гольф , найменша кількість виграшів символів.
Приклад не-golfed оптимальне рішення можна знайти тут
Compile з -std=c99
, першим аргументом є розмір плати, інші аргументи розміри корабля. Список кадрів, розділених новим рядком, наведено на stdin. Приклад:
./a 4 1 1 1 <<< $'A2\nA4\nB3\nC3\nC4\D4'
10x10
за допомогою 4,3,2,1
судноплавства
26x26
? Я накреслив рішення, засноване на регулярних виразів та рекурсії, і воно стає надзвичайно повільним = непридатним для полів більше6x6
. Або я роблю щось дуже дурне, або відсутність відповідей означає, що й інші не мають успіху.