これは古い質問であることは知っていますが、自分で問題を解決しているときにこれに遭遇しました。ここでの回答はどれも完璧ではなく、いくつかは複雑な注意事項があったり、病的なレイアウトで壊れたりします。これが私の解決策です:
マークのないタイルでボードを (後方ではなく前方に) 解決します。一度に 2 つの空きタイルを削除します。削除する各ペアを「一致したペア」スタックにプッシュします。多くの場合、これだけで十分です。
行き止まり (numFreeTiles == 1) に遭遇した場合は、ジェネレーターをリセットしてください :) 私は通常行き止まりにぶつかることはなく、これまでのところ 10 回程度の最大再試行回数は 3 回であることがわかりました。私が試したレイアウト。8回リトライしたらあきらめて、残りのタイルをランダムに割り当てます。これにより、プレイヤーが失敗して 100% 解決不可能な状態になった場合でも、ボードのセットアップとシャッフル機能の両方に同じジェネレーターを使用できます。
行き止まりになったときのもう 1 つの解決策は、別の道に進むことができるまで後退することです (スタックから飛び出して、ボード上のタイルを交換します)。元のブロック タイルを削除するペアを一致させることで、別の道を進みます。
残念ながら、ボードによっては、これが永遠にループする可能性があります。後続のすべての「道路」が行き止まりであり、複数の行き止まりがある「出口のない」道路に似たペアを削除することになった場合、アルゴリズムは決して完了しません。これが当てはまるボードを設計できるかどうかはわかりませんが、そうであれば解決策はまだあります。
このより大きな問題を解決するには、考えられる各ボード状態を DAG のノードとして扱い、選択した各ペアをそのグラフのエッジにします。深さ 72 でリーフ ノードが見つかるまで、ランダムなトラバーサルを行います。下降を繰り返さないように、トラバーサルの履歴を追跡します。
私が使用したレイアウトでは、最初に試すソリューションよりも行き止まりが少ないため、すぐに頭に浮かぶのはハイブリッド ソリューションです。最初に最小限のメモリで解決してみてください (選択したペアをスタックに保存します)。最初の行き止まりに到達したら、各ノードにアクセスするときに完全なマーキング/エッジ生成を行うように低下します (可能な場合は遅延評価)。
ただし、私はグラフ理論の研究をほとんど行っていないため、DAG のランダム トラバーサル/検索の問題に対するより良い解決策があるかもしれません :)
編集:2008年10月13日の投稿で、ボードを逆に生成する私のソリューションを実際に使用できます。それでも行き止まりになる可能性があるため、同じ注意事項があります。ただし、ボードを逆に生成するには、より複雑なルールがあります。たとえば、長い行が 1 つあるレイアウトのように、最初のピースが中央にある行の少なくとも一部を開始しないと、セットアップに失敗することが保証されます。前方解決ジェネレーターで完全にランダムな (合法的な) 最初の動きを選択すると、解決可能なボードにつながる可能性が高くなります。