目標を簡潔に説明する方法がわかりません。これが、十分な検索にもかかわらず適用可能なアルゴリズムを見つけることができなかった理由かもしれませんが、画像はそれを明確に示しています。
左側のグリッド内のアイテムの状態を考えると、右側のグリッドに示されている終了位置を効率的に見つけるアルゴリズムを知っている人はいますか? この場合、すべてのアイテムが「落ちた」「落ちた」のですが、もちろん方向は任意です。要点は次のとおりです。
- 任意の形状のアイテムの集まりがありますが、すべて連続した正方形で構成されています
- アイテムは重複できません
- すべてのアイテムは、壁に触れるまで、または[...別のアイテムに無限に触れている...]壁に触れている別のアイテムに触れるまで、指定された方向に最大距離移動する必要があります。
これは宿題ではありません。私は学生ではありません。これは、幾何学とプログラミングに対する私自身の興味のためです。それは問題ではないので、私は言語について言及していません。取り組んでいる特定のプロジェクトに使用している言語で、どんなアルゴリズムでも実装できます。有用な答えは、言葉またはコードで説明できます。重要なのはアイデアです。
この問題は、依存関係とスラック スペースのある種のグラフ (数学的な意味で) に抽象化される可能性があるため、ラグ タイムを最小限に抑えることを目的としたアルゴリズムを適応させることができます。
答えがわからないが、その場でアルゴリズムを作成しようとしている場合は、連動するピンク (後方) の「C」と青色の「T」の形など、循環依存関係が存在する可能性があることを覚えておいてください。T の部分は C の下にあり、C の部分は T の下にあります。連動するアイテムが複数のピースの「ループ」によってロックされている場合、これはさらに厄介です。
適用可能なアルゴリズムに関するいくつかの注意事項: グリッド オブジェクト管理フレームワークを構築した方法により、以下のすべてが非常に簡単かつ迅速に実行できます。
- ピース内の個々の正方形を列挙する
- すべてのピースを列挙する
- グリッド全体で特定の正方形を占めるピースがある場合はそれを見つけます
答えに関するメモ: maniek が最初にそれをほのめかしましたが、bloops が素晴らしい説明を提供してくれました。絶対的な鍵は、同じ量を移動するすべてのピースが互いに関係を維持しているという洞察であり、したがって、それらの関係を考慮する必要はないと思います.
人口がまばらなボードの追加のスピードアップは、すべてのピースをシフトして、完全に空の行を排除することです。空の行を数えて、空の行の片側 (「上」) にあるピースを識別するのは非常に簡単です。
最後のメモ:私は実際に bloops で記述されたアルゴリズムを実装しましたが、実装固有の変更がいくつかありました。美しく機能します。