3x3 グリッドを想像してください:
[A, B, %]
[C, %, D]
[E, F, G]
パーセンテージ%
は、空きスペース/位置を表します。
行は、最初の行の構成の順列が次のいずれかになるように、文字列のビーズのように移動できます。
[A, B, %] or [A, %, B] or [%, A, B]
2行目も同様。3 番目の行には空のスロットが含まれていないため、変更できません。
各行の可能な順列を考慮して、可能なすべてのグリッドを作成しようとしています。
出力は次のグリッドを生成する必要があります。
[A, B, %] [A, B, %] [A, B, %]
[C, D, %] [C, %, D] [%, C, D]
[E, F, G] [E, F, G] [E, F, G]
[A, %, B] [A, %, B] [A, %, B]
[C, D, %] [C, %, D] [%, C, D]
[E, F, G] [E, F, G] [E, F, G]
[%, A, B] [%, A, B] [%, A, B]
[C, D, %] [C, %, D] [%, C, D]
[E, F, G] [E, F, G] [E, F, G]
各行を調べてスペースを左右にシフトし、それから新しいグリッドを生成して再帰する方法を試しました。すべてのグリッドをセットに保持し、無限再帰を防ぐために、まだ調査されていない位置のみを生成するようにします。
ただし、私のアルゴリズムは非常に非効率的 (順列ごとに ~1 秒!!) のようで、見栄えもよくありません。これを行う雄弁な方法があるかどうか疑問に思っていましたか?特にパイソンでは。
私には漠然としたアイデアがいくつかありますが、見落としている短くて簡単な方法があると確信しています。
編集: 3x3 は単なる例です。グリッドは任意のサイズにすることができ、重要なのは行の組み合わせです。例えば:
[A, %, C]
[D, E, %, G]
[H, I]
も有効なグリッドです。
編集 2:文字は順序を維持する必要があります。たとえば[A, %, B] != [B, %, A]
、[B, A, %]
有効ではありません