私にとってより興味深い問題になったので、いくつかの仮定/変更を加えて問題を調べることにしました。
1) 山のどの部分からでも要素を左右に移動できます。
2) エレメントのサイズが大きいか小さいか、同じサイズかに関係なく、要素を山に積み重ねることができます。
3) スタックをどのように通過しても、小さい数値の前に大きい数値に遭遇しない限り、配列はソートされていると見なされます。したがって、_ 11 2 3 はソートされますが、_ _ 12 3 はソートされません。これは、2 が 1 の前にあると解釈できるためです。
この公理にもかかわらず、これは非常に興味深い問題につながります。
公理 A: 移動する順序は関係ありません。同じ最終結果を得るために、どのような方法でも並べ替えることができます。
公理 Ab: 配列に繰り返しがない場合は、すべての要素を最終位置に移動するだけです。
特に、局所的な調査のみで再帰性/バックトラッキングなしで解決できることを期待して戦略を開発しましたが、これが無益であることを証明したので、後で示します。
私の戦略は次のとおりです。
1) 左から右に進み、間違った方向に裏返されたペアを探します (低い数値の前に高い数値)。
2a) 1 つを見つけたときに、右側の値ですぐに満たされる空のスポットまたはスタックがある場合は、それが満たされるまで左に移動します。
2b) それ以外の場合は、左の値を右に移動します。これにより、無関心な数のスタックがある状況が作成されます。最初に、下に比較する前に、1) のロジックに従って、右に移動した値と新しい右にある値を比較します。
2bii) 下方比較を対比較と同じように扱う - 空のスポットまたはスタックに収まる場合は、低い方の値を左に移動し、そうでない場合は、高い方の値を右に移動して続行します。
例:
1231 -> スタックに収まるため、1b を左にシフトします。11 2 3 _
1321 -> 2 は空のスポット/スタックに収まらないため、3 を右にシフトします。1b は空のスポットに収まる/スタックに収まるため、左に 2 回シフトします。次に、2 は空のスポット/スタックに収まらないため、3 を右にシフトします。1 1 2 3
1132 -> 2 は左に移動できないため、3 を右にシフトします。空の場所に収まるので、左に 2 シフトします。1 1 2 3
2311 -> 1a は左に移動できないため、3 を右にシフトします。1b は空の場所に収まるため、左に 2 回シフトします。スタックするので、1a を左にシフトします。1a1b は左に移動できないため、2 を右にシフトします。1a2b は空のスポットを埋めるため、左にシフトします。11 2 3 _
ただし、これら 2 つの開始配列で問題が発生します。
23411 10手が最適、2r 3r 4r 1al*3 1bl*4で11 2 3 4 _.
23111 9 手が最適、2r*3 3r*3 1bl 1cl*2 を _ _ 111 2 3 にする - 23411 戦略の反対! 1 の方が多いため、1 を少なく動かし、23 を多く動かします。
これは、この新しい問題を解決するために単純なローカル比較を行うことはできないことを示しています.
私はまだこの問題について考えています。興味をそそる方法で自明ではないように思えます。私と一緒にこれを考えることを楽しんでくれる人がいるといいのですが:)