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