В китайских шашках фигура может двигаться, перепрыгивая через любую другую фигуру или создавая последовательность таких прыжков. Ваша задача - найти максимально длинную последовательность прыжков.
вход
Последовательность из 121 нуля или единиц, каждый из которых представляет место на доске. Ноль означает, что место пусто; один означает, что место занято. Позиции перечислены слева направо; сверху донизу. Например, ввод этой установки будет
1011110011000001000000000000000000000000100000000001000000000000000000000000000001000000000000000000000001000001100111111
Объяснение:
Самое верхнее место занимает зеленая часть, поэтому первая цифра на входе -
1
. Второй ряд имеет одну пустую позицию, а затем одну занятую позицию, поэтому01
следующий. Третий ряд уже занят, так что111
. В четвертом ряду два пустых и два занятых пробела (слева направо), поэтому0011
. Затем идут пять0
, а1
и семь0
для следующего ряда и так далее.
Как и в этой настройке, есть угол, направленный прямо вверх. На доске может быть любое количество фигур (от 1 до 121). Обратите внимание, что кусочки разных цветов не представлены по-разному.
Выход
Максимальная длина легального прыжка, используя любую фигуру на доске. Вы не можете посещать одно и то же место более одного раза (включая начальную и конечную позиции). Тем не менее, вы можете перепрыгнуть через один и тот же кусок более одного раза. Если легального прыжка нет, выведите 0
. Не думайте, существует ли законный ход без прыжка.
Например, выход для настройки, описанной выше, является 3
.
Ввод и вывод могут быть выполнены через stdin и stdout, через аргументы командной строки, через вызовы функций или любой подобный метод.
Тестовые случаи
Входные данные:
0100000010000000000000000100000000000000000000000000000001010010000000000000000000000101000000000000000000100000000100001
Вывод: 0
(нет двух частей рядом друг с другом)
Входные данные:
0000000000111100000000011100000000011000000000100000000000000000000000000000000000000000000000000000000000000000000000000
Выход: 1
(начальная настройка для одного игрока в левом верхнем углу)
Ответы:
Perl,
345322Редактировать: игра в гольф, слегка.
Было бы неплохо больше тестовых случаев, но пока все выглядит так, как будто это работает. Я добавлю комментарии позже, если это необходимо. С переводом строки и отступом для удобства чтения:
источник
С
262260Гольф-код (отладочный код и лишние пробелы удалены. Изменен с ввода через stdin на ввод через командную строку, и воспользовался возможностью объявить переменную i там. Последнее редактирование: код перемещен в скобки
for
циклов, чтобы сохранить две точки с запятой.)объяснение
Это основано на плате 20x21, которая выглядит следующим образом, изначально заполненная нулями, когда программа запускается (это искусство ASCII было сгенерировано измененной версией программы, и, поскольку
i
цикл считает вниз, ноль находится в нижнем правом углу):Цикл
i
проходит через эту доску дважды, используя x и y, чтобы вычислить, принадлежит ли квадрат к шахматной доске или нет (для этого требуется 6 отдельных неравенств по x и y.)Если это так, то в первый раз он заполняет квадраты, помещая
0
(ложь) для1
(занятого) и1
(правдивого) для0
(незанятого). Эта инверсия важна, потому что все вне допустимых квадратов уже содержат 0, что означает, что они напоминают занятые квадраты, и ясно, что на них нельзя прыгать без необходимости специальной проверки.Во второй раз, если квадрат занят (содержит 0), он вызывает функцию,
f
которая ищет ходы.f
выполняет рекурсивный поиск в 6 возможных направлениях, закодированных в выражении +/- 1 (по горизонтали), +/- 20 (по вертикали) и +/- 19 (по диагонали)"AST?-,"[k]-64
. Когда он находит попадание, он устанавливает эту ячейку в 0 (занято) перед рекурсивным вызовом, а затем возвращает ее в 1 (пусто), когда функция возвращается. Значение ячейки должно быть изменено перед рекурсивным вызовом, чтобы предотвратить переход в эту ячейку более одного раза.Код без правил
источник