拡張列車交換問題
パート1:通常の列車交換問題
1996年のCCC(カナダコンピューティングコンペティション)では、最初のステージ2の問題は列車交換問題でした。ここのリンクにアクセスできます。基本的に、番号付きの列車の束があり、それらを順番に取得するために必要な列車の入れ替えの数を調べたい場合、各列車の入れ替え操作では、隣接する2つの列車を入れ替えることができます。車両はどちらの方向にも走ることができるので、入れ替えたときに車両が反対方向に向いていることを誰も気にしません。これはとても簡単です。あなたがする必要があるのは:
それをバブルソートするためのステップ数を見つけます。隣接する要素の交換のみを行うことができる場合、これは最も効率的なソートアルゴリズムです。
だから、もっと難しいものを作りました。
パート2:この課題の仕組み
基本的に、隣接する列車だけでなく、交換することができます。回転プラットフォームが長いと、複数の列車の位置を入れ替えることができます。たとえば、長さが4の回転プラットフォームでは、内側と外側のペアを同時に交換できるため、に1 2 3 4
なり4 3 2 1
ます。さまざまな回転プラットフォームサイズの例を以下に示します。
Length 2:
1 2 3 4 5
---
1 3 2 4 5
Length 3:
1 2 3 4 5
-----
1 4 3 2 5
Length 4:
1 2 3 4 5
-------
4 3 2 1 5
基本的には、列車全体のサブリストを反転するだけです。明確にするために、各移動では、トレインを正確に 交換することしかできませんN
。
パート3:仕様
入力
入力には、回転プラットフォームの長さと車両の順序の2つを取り込む必要があります。必要に応じて、車両の数も必要になる場合があります。列車の車両の順序は、番号の順序付きリスト(各番号は列車の車両を表す)によって与えられるため、入力をスペース区切りの整数、改行区切りの整数、配列などとして読み取ることができます。
出力
キャリッジをすべて注文に入れるために必要なスワップの最適(最小)数を出力する必要があります1 2 3 ... N
。何の解決策、出力がない場合-1
、No solution
または他のいくつかの一貫したメッセージ。stderrに出力できない場合があります。
得点
これはコードゴルフの課題なので、スコアはバイト単位です。2016年9月1日の時点でバイト数が最も少ないソリューションが受け入れられます。
例
問題1 入力
4
2
1 3 2 4
出力
1
説明
これはかなり簡単です。長さ2の回転プラットフォームでは、通常の列車交換問題と同じです。スワップ2
と3
。
問題2 入力
4
3
1 3 2 4
出力
No solution (or an equivalent consistent message).
問題3 入力
9
3
1 4 5 6 3 8 7 2 9
出力
4
説明
1 4 5 6 3 8 7 2 9
-----
1 4 5 6 3 2 7 8 9
-----
1 4 5 2 3 6 7 8 9
-----
1 4 3 2 5 6 7 8 9
-----
1 2 3 4 5 6 7 8 9
幸運を!
編集1:入力フォーマットをより柔軟にしました。@Megoに感謝!
編集2:長さ4の回転プラットフォームが内部ペアと外部ペアの両方を交換することを明確にしました。@TimmyDに感謝!
編集3:N
せいぜいではなく、正確に長さの順列を作成する必要があることを明確にしました。@Zgarbに感謝!