Masalah
Katakanlah Anda memiliki N tumpukan bernama S 1 hingga S N , di mana setiap S k (k = 1 hingga N) berisi N salinan dari angka k.
Misalnya, ketika N = 3 tumpukan terlihat seperti ini:
1 2 3 <- top of stack
1 2 3
1 2 3 <- bottom of stack
=======
1 2 3 <- stack index
Di sini ada 3 tumpukan yang diindeks sebagai 1, 2, dan 3, dan masing-masing berisi N contoh indeksnya sendiri.
Tujuannya adalah untuk mengatur ulang tumpukan N sedemikian rupa sehingga masing-masingnya secara identik berisi angka 1 hingga N secara berurutan dari atas ke bawah.
misalnya untuk N = 3 tujuannya adalah untuk mengatur ulang tumpukan menjadi:
1 1 1
2 2 2
3 3 3
=======
1 2 3
Satu-satunya tindakan yang dapat Anda lakukan dengan tumpukan adalah mengambil nomor atas dari salah satu tumpukan (muncul) kemudian segera menempatkannya di atas tumpukan yang berbeda (mendorong) . Ini tunduk pada ketentuan ini:
Angka hanya dapat didorong ke tumpukan jika kurang dari atau sama dengan nomor teratas di tumpukan itu.
misalnya
1
dapat didorong ke stack dengan1
,2
atau3
di bagian atas, tetapi2
hanya dapat didorong ke stack dengan2
atau3
(atau lebih tinggi) di bagian atas.Ini memiliki efek bahwa tumpukan selalu meningkat secara monoton dari atas ke bawah.
Setiap tumpukan kosong dapat muncul dari, dan, dengan asumsi peluru sebelumnya puas, tumpukan apa pun dapat didorong ke.
Jumlah apa pun dapat didorong ke tumpukan kosong.
Tumpukan tidak memiliki batas ketinggian maksimum.
Tumpukan tidak dapat dibuat atau dihancurkan, selalu ada N dari mereka.
Tantangan ini adalah tentang memutuskan muncul dan dorongan yang harus dilakukan untuk menyelesaikan pertukaran tumpukan, tidak harus dalam gerakan paling sedikit, tetapi dengan cara yang pasti.
(Berlatih dengan setumpuk kartu adalah cara yang baik untuk merasakan masalahnya.)
Tantangan
Tulis program atau fungsi yang mengambil dalam bilangan bulat positif N, dijamin 3 atau di atas. Cetak atau kembalikan string yang menunjukkan semua tindakan pop-push yang diperlukan untuk mengatur ulang tumpukan dari kondisi awal:
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 case)
Ke kondisi akhir:
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
Setiap baris dalam output Anda harus berisi dua angka yang dipisahkan oleh spasi. Angka pertama adalah indeks tumpukan untuk muncul dan nomor kedua adalah indeks tumpukan untuk didorong. Melakukan tindakan semua lini agar mengatur tumpukan dengan benar tanpa melanggar aturan.
Sebagai contoh, berikut ini adalah output potensial yang valid untuk kasus 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
Catatan
Output Anda tidak perlu optimal , hanya benar. yaitu Anda tidak perlu meminimalkan jumlah muncul dan dorongan.
- Jadi tidak apa-apa jika, katakanlah, beberapa gerakan dilakukan berulang kali dan segera dibalik.
- Popping dan mendorong ke stack yang sama dalam satu gerakan, misalnya
2 2
, diizinkan juga (meskipun tentu saja tidak ada gunanya).
Output Anda memang harus deterministik dan terbatas.
Ingat bahwa tumpukan memiliki pengindeksan berbasis 1. Pengindeksan berbasis 0 tidak diizinkan.
N lebih besar dari 9 tentu saja harus berfungsi sama seperti satu digit N.
Jika diinginkan, Anda dapat menggunakan dua karakter ASCII yang berbeda dan tidak dapat dicetak untuk menggantikan spasi dan baris baru. Baris baru yang tertinggal (atau pengganti baris baru) dalam output baik-baik saja.
Mencetak gol
Kode terpendek dalam byte menang. Tiebreaker adalah jawaban dengan suara lebih tinggi.
Poin brownies berharga jika Anda dapat menunjukkan algoritma Anda optimal.
-._(._.)_.-
N=3
optimal?