проблема
Скажем, у вас есть N стеков с именами от S 1 до S N , где каждый S k (от k = 1 до N) содержит N копий числа k.
Например, когда N = 3, стеки выглядят так:
1 2 3 <- top of stack
1 2 3
1 2 3 <- bottom of stack
=======
1 2 3 <- stack index
Здесь есть 3 стека, проиндексированных как 1, 2 и 3, и каждый содержит N экземпляров своего собственного индекса.
Цель состоит в том, чтобы переставить N стеков так, чтобы каждое из них идентично содержало числа от 1 до N в порядке сверху вниз.
например, для N = 3 цель состоит в том, чтобы переставить стеки в:
1 1 1
2 2 2
3 3 3
=======
1 2 3
Единственное действие, которое вы можете выполнить со стеками, - это взять верхний номер из одного из стеков (выталкивание), а затем немедленно поместить его поверх другого стека (толкание) . Это зависит от следующих условий:
Число может быть помещено в стек только в том случае, если оно меньше или равно верхнему числу в этом стеке.
например,
1
может быть выдвинут на стек с1
,2
или3
в верхней части, но2
может быть выдвинут только на стек с2
или3
(или выше) в верхней части.Это приводит к тому, что стеки всегда монотонно увеличиваются сверху вниз.
Любой непустой стек может быть извлечен, и, если предыдущий маркер удовлетворен, любой стек может быть передан.
Любое число может быть помещено в пустой стек.
Стеки не имеют ограничения по максимальной высоте.
Стеки не могут быть созданы или уничтожены, их всегда N.
Эта задача состоит в том, чтобы решить, какие щелчки и толчки нужно сделать, чтобы завершить обмен стека, причем не обязательно за наименьшее количество ходов, но безошибочно.
(Практика с колодой карт - хороший способ почувствовать проблему.)
Вызов
Напишите программу или функцию, которая принимает положительное целое число N, гарантированно равное 3 или выше. Выведите или верните строку, которая обозначает все всплывающие действия, необходимые для перестановки стеков из исходного состояния:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
=============
1 2 3 4 5
(Случай N = 5)
До конечного состояния:
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
=============
1 2 3 4 5
Каждая строка в вашем выводе должна содержать два числа, разделенных пробелом. Первое число - это индекс стека для извлечения, а второе число - это индекс стека, к которому нужно выдвинуть. Выполнение действий всех линий по порядку должно правильно расставлять стеки, не нарушая никаких правил.
Например, вот потенциальный допустимый выход для случая N = 3:
1 2 [move the top number on stack 1 to the top of stack 2]
1 2 [repeat]
1 2 [repeat]
3 1 [move the top number on stack 3 to the top of stack 1]
2 3 [etc.]
2 3
2 3
2 1
2 1
2 1
3 1
3 1
3 1
3 2
1 2
1 2
1 2
1 3
2 3
2 3
2 3
1 2
3 2
3 1
Заметки
Ваш вывод не должен быть оптимальным , только правильным. т.е. вам не нужно минимизировать количество всплывающих окон и толчков.
- Так что было бы хорошо, если бы, скажем, какой-то шаг был неоднократно сделан и немедленно изменен.
- Попадание в один и тот же стек за один ход, например
2 2
, также разрешено (хотя, конечно, бессмысленно).
Ваш вывод делает потребность быть детерминированным и конечным.
Помните, что стеки имеют индексирование на основе 1. Индексирование на основе 0 не допускается.
N больше 9, конечно, должно работать так же хорошо, как однозначное число N.
При желании вы можете использовать любые два различных нецифровых печатаемых символа ASCII вместо пробелов и символов новой строки. Конечный символ новой строки (или заменитель новой строки) в выводе - это нормально.
счет
Самый короткий код в байтах побеждает. Ответ Tiebreaker выше.
Бесполезные очки брауни, если вы можете показать, что ваш алгоритм оптимален.
-._(._.)_.-
N=3
оптимального?