Проблема
Скажімо, у вас 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
Єдина дія, яку ви можете виконати зі стеками, - це взяти верхній номер з однієї з стеків (вискакувати), а потім негайно поставити його на інший стек (штовхаючи) . Це стосується цих положень:
Число може бути висунуте на стек лише у тому випадку, якщо воно менше або дорівнює верхньому номеру в цій стеці.
наприклад, a
1
може бути висунуто на стек з a1
,2
або3
вгорі, але a2
може бути висунуте на стек лише з a2
або3
(або вище) вгорі.Це призводить до того, що стеки завжди монотонно збільшуються зверху вниз.
Будь-який непустий стек може вискочити з, і, якщо попередня куля задоволена, будь-який стек може бути висунутий на.
Будь-яке число може бути висунуте на порожній стек.
У штабелів немає максимальної межі висоти.
Стеки неможливо створити або знищити, їх завжди є N.
Ця задача полягає в тому, щоб визначити, що з'являється та штовхає зробити для того, щоб завершити обмін стеками, не обов'язково за найменші ходи, але надійним способом.
(Тренуватися з колодою карт - хороший спосіб відчути проблему.)
Виклик
Напишіть програму або функцію, яка має додатне ціле число N, гарантовано рівне 3 або вище. Роздрукуйте або поверніть рядок, який позначає всі дії поп-push, необхідні для перестановки стеків у початковий стан:
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 замість пробілів та нових рядків. Зворотний новий рядок (або замінник нового рядка) у виході є нормальним.
Оцінка балів
Виграє найкоротший код у байтах. Tiereaker є вищою відповіді.
Безцінні бали брауні, якщо ви можете показати свій алгоритм, є оптимальним.
-._(._.)_.-
N=3
оптимального?