今晩私は木のパズルを解こうとしたので、この種の問題をプログラマティックに解決する最良の方法は何か疑問に思った。この種のゲームを解決する最良の方法はどれですか?
固体の集合(三次元のテトリス片のような)を一緒に組み合わせて、フィクスチャが合わさっている場合にのみ片を構造体に取り付けることができるという事実を考慮に入れた実現可能な形で形状を形成することが目的です移動の種類(回転を無視し、90°の回転のみ)。
「this」を参照してください。
今晩私は木のパズルを解こうとしたので、この種の問題をプログラマティックに解決する最良の方法は何か疑問に思った。この種のゲームを解決する最良の方法はどれですか?
固体の集合(三次元のテトリス片のような)を一緒に組み合わせて、フィクスチャが合わさっている場合にのみ片を構造体に取り付けることができるという事実を考慮に入れた実現可能な形で形状を形成することが目的です移動の種類(回転を無視し、90°の回転のみ)。
「this」を参照してください。
私の最新のCSクラスでは、状態をC++でオブジェクトとして表現することによって機能する一般的なパズルソルバーを作成しました。各オブジェクトには、それが表す状態を別の状態と比較するメソッドがありました。これは、状態がすでに見られたかどうかを判断するためのメモ作成に使用されました。各状態には、その状態から直接到達可能な状態(すなわち、ブロックの回転、ブロックの配置、ブロックの移動)を生成する方法もありました。ソルバは、キューの状態を維持し、キューの先頭から状態をポップし、それが所望の状態(パズルが解決された)であるかどうかを調べることによって動作した。そうでない場合は、メモが(ハッシュされたセットを使用して)メモを確認して、状態が既に確認されているかどうかを確認します。そうでない場合は、現在の状態から到達可能な状態が生成され、キューの後部に追加されます。空のキューが解決できないパズルを伝えました。
3Dのようなものを概念化するのは難しいでしょうが、それはコンピュータ化されたパズル解決の基本的なアプローチです。
コンピュータの場合、可能な組み合わせが少ないため、単純な検索アルゴリズムを試してみることになるため、多少の問題は少なくなります。 私はalgorithmを意味し、すべての可能な構成をチェックし、この構成の結果から、最終構成(あなたの場合はキューブ)で終わるまで続きます。
問題の継ぎ目は、すべての状態チェックと変換を1つの状態から別の状態に行うことができるプログラムを作成することです。構成が物理的に可能かどうかを確認する必要があるからです。
3次元polyominoのパッキングに問題があると思われます。その対象には様々なscholarly papersがあります。
あなたが処理したいパズルが、あなたがリンクしている写真のパズルであれば、底に向かうまで、可能な解決策のツリーを検索することはおそらく実行可能です。
各パズルピースが顔に取り付けられたキューブの数であり、各キューブに各ピースを合わせることによってパズルを解決するには、各キューブの4倍にしてください続く。
各ピースの任意の立方体を原点として宣言します。それぞれのパズルピースに24回の可能な回転があることを観察します。起点キューブの可能な各面の1つの向きが上向きになり、その位置の垂直軸の周りに4倍の回転が可能です。
同じ最終的なピースを生成する可能性のある方向を探すことによって検索空間を切り取ろうとすると、ある回転が起きて、起点キューブが他のキューブに変換された場合、以前に検討されたローテーションとしてのボリュームは、将来の検討からそのローテーションを取り除く。
バッグから引き出します。バッグに駒がない場合は、これが解決策です。溶液体積の各セルと、各セルの引っ張りピースの各回転をループします。ピースが検索ボリューム内に完全にあり、他のピースと重複していない場合は、この段落に戻ります。それ以外の場合は、次の回転に進むか、それ以上回転がない場合は次のセルに進みます。それ以上のセルがない場合は、解決せずに戻ります。
解決せずに最後の段落が戻った場合、パズルは解決できませんでした。
問題の画像よりも大きな問題については、より良い(そして明示的な)枝生成のための枝刈り戦略が必要になります。前述したように、状態空間は、sum_ {i = 1}個(目標* 6 [回転]の体積)であり、「直接到達可能」状態を生成するのに費やされる時間は、 BFSの代わりにDFSを使用してもよいでしょう。 – p00ya
BFSのポイントは、状態に「最短パス」を提供することです。 DFSは、必ずしも最短ではなく、その状態になる最初のブランチを選択します。 – Edward