Это обычная головоломка, которую многие из вас решили вручную. Теперь пришло время написать алгоритм для решения того же.
Есть две одинаковые палочки, выстроенные в линию с двух разных сторон, обращенных друг к другу. Между ними есть одно пустое пространство. Скажите что-то вроде следующего рисунка (если общее количество совпадений равно 4).
Каждая палка может либо скользить на один шаг вперед (если непосредственное переднее пространство свободно), либо ее можно перепрыгнуть через одну палку спереди и приземлиться в свободное пространство (если это пространство свободно). Перемещение в обратном направлении невозможно (даже свободное место). Обратный прыжок также не допускается. Только один ход разрешен за один шаг.
Теперь вы должны написать алгоритм, чтобы найти минимальные требуемые шаги, используя которые все палки соответствия левой стороны попадут в правую сторону, а все палочки соответствия правой стороны попадут в левую сторону.
Например: если есть всего 2 спички (по 1 с каждой стороны), то шаги будут:
Примечание. На приведенном выше рисунке левая боковая ручка была перемещена первой. Другое решение существует, когда правая боковая ручка движется первой. Но для этой проблемы вы должны дать только одно решение, и это также предполагает, что левая ручка движется первой.
На следующем рисунке описаны ходы с 4 спичками (по 2 с каждой стороны):
Примечание. На приведенном выше рисунке левая боковая ручка была перемещена первой. Другое решение существует, когда правая боковая ручка движется первой. Но для этой проблемы вы должны дать только одно решение, и это также предполагает, что левая ручка движется первой.
[Предположение: вход может быть любым четным числом от 02 до 14 (т.е. от 1 до 7 совпадающих палочек на каждой стороне). Для входных данных, выходящих за пределы этого диапазона, вам не нужно выполнять какую-либо проверку, а также не нужно предоставлять никаких сообщений об ошибках. Примечание. В выходных данных каждый шаг отделяется знаком «|». (труба) персонажа. Программисты на языке COBOL всегда должны принимать PIC 9 (2) в качестве размера ввода и могут также предполагать, что вывод имеет фиксированную максимальную длину 450 символов, дополненную пробелами справа.]
Пример ввода:
02
Пример вывода:
01To02|03To01|02To03|
Пример ввода:
04
Пример вывода:
02To03|04To02|05To04|03To05|01To03|02To01|04To02|03To04|
Пример ввода:
06
Пример вывода:
03To04|05To03|06To05|04To06|02To04|01To02|03To01|05To03|07To05|06To07|04To06|02To04|03To02|05To03|04To05|
источник
Ответы:
APL 129
Приведенный ниже код принимает экранный ввод и выводит на экран в указанном формате:
Хорошая треть кода занимает форматирование вывода. Логика завершена появлением символа in в коде.
Ниже приведен результат для ввода 08 в качестве проверки:
источник
Javascript
178 174161prompt
s дляn
тогдаalert
s ответа. (Без0
заполнения)Самый последний:
2:
1:
Это использует концепцию, что образец отражен:
Итак, где
n=2
, модель движения:Что приравнивается к
Этот шаблон повторяется как так (
n=8
)Мы можем заметить несколько моделей здесь:
n/2
, которое повторяется 3 раза, а затем уменьшается до 1.1
, а количество последовательных прыжков увеличивается от 1 доn/2
затем уменьшается до 1.n=14
:Пример вывода:
f(2)
:f(8)
:f(40)
:Вот некоторый псевдокод для демонстрации метода:
источник
l/L/r/R
иm/j
. Мне нравится идея разделения расстояния, перемещенного от направленияС -
216213Мое решение основано на двух фактах:
Поле «to» - это поле «from» предыдущего хода (поскольку вы всегда создаете пустую ячейку в пространстве, из которого перемещаетесь, и вы всегда перемещаетесь в пустую ячейку)
Существует очень регулярный образец расстояний и направлений, которые перемещаются. Для первых 3 тестовых случаев это:
1 -2 1
1 -2 -1 2 2 -1 -2 1
1 -2 -1 2 2 1 -2 -2 -2 1 2 2 -1 -2 1
Имея это в виду, я просто написал программу для создания и продолжения этого паттерна. Я почти уверен, что должен быть действительно красивый и намного более изящный рекурсивный способ написать это, но я еще не понял это:
И игра в гольф (хотя это был вызов, а не гольф):
источник
scanf
. Я обновляю свой ответ лучшей версией.N(2)=rLr
,N(4)=rLlRRlLr
,N(6)=rLlRRrLLLrRRlLr
и т.д.Mathematica
Этот подход строит
Nest
последовательность ed размера и направления ходов, отформатированную{fromPosition,toPosition}
, начиная с позицииn
, гдеn
относится к числу пар совпадений. ЗатемFold
последовательность превращается в функцию, которая начинается с перемещения{n, n+1}
.Визуализация свопов
r
,b
иo
являются изображениями или красным соответствием, синим соответствием и отсутствием совпадения соответственно.Следующие данные форматируют вывод
z
для отображения свопов со совпадениями.swaps
создает список состояний, используя упорядоченные парыz
команд as для изменения начального и последующих списков.swapMatches
отображает состояния в сетке.источник
Javascript 191
Персонажи, подсчитанные с использованием
grep =|tr -d \ |wc -c
источник
02
значения верны, но в конце отсутствует трейлинг|
. В двух других случаях значения не соответствуют действительности, и форматирование10
также неверно. Также не уверен насчет вашего метода подсчета символов. Почему вы считаете только тело функции минус возврат?tr -d \ |wc -c
учитывает переводы строк