グリッド内のノードのシーケンスを検出する


12

下の画像から、ボード上で最も最適なシーケンス(緑色の線)を検出する必要があります。青/赤の線は可能性を表していますが、最高の動きではありません。

ルールは次のとおりです。

  1. 同じタイルで、隣のタイルに移動できます(斜めが有効です)
  2. 一度タイルにアクセスすると、再度アクセスすることはできません。

各ノードをループし、その隣接ノードを調べ、再帰的に通過することを考えました。可能な動きを見つけたら、それを構造に入れることができます。すべての可能な動きが見つかったら、ノードの数が最も多い動きを選択します。ノードに一致する複数のネイバーがある場合、より困難になります。

だから、私が使用できるアルゴリズムはありますか?ある種の洪水を考えていましたが、それはルール#2を満たしていません。

要求に応じて、ここに同様のゲームプレイのビデオがあります。http://youtube.com/watch?v=eumnCTG0AE8

ここに画像の説明を入力してください


3本の剣/金が一致する可能性があることに注意することが重要かもしれませんが、私はそれらを画像に含めませんでした。

3本の剣/金が一致する可能性があるのはなぜですか?少なくとも3つのアイテムで構成されるすべてのパスを検索しますか?
bummzack

ええ、それがアイデアです。

回答:


6

リンクされた同一のシンボルの各グループを考慮することができる(及びリンクによって私はあなたが一つのシンボルから別のものに移動することを意味)の別々のグラフ。そのようなグラフごとに、そのグラフの最長パスの一部ではないグラフの各ノードから始まる深さ優先検索(DFS)を適用します。DFSの適用中に行き止まりに達するたびに、たった今通過したパスがこれまでに発見したグローバルな最大値よりも長いかどうかを確認します。存在する場合は、新しい最長パスとして保存します。

前の段落で、各グラフに複数回DFSを適用することに言及したことに気づくでしょう。グラフ上で単一のDFSを実行するだけでは不十分です。この特定のケースを考慮してください:

    1
1 1 1
    1
    1
    1
    1

偶然、最上位ノードのこのグラフで最初にDFSを実行すると、可能な限り長いパスが垂直線であることがわかりますが、それは正しくありません。これは、結果のパス内のどこかにあるか、まったく含まれていないノードでDFSアルゴリズムを開始するたびに発生します。この特定の例で行う必要があるのは、2行目の左端のノードからDFSアルゴリズムを開始することです。それは正しいパスを見つけます。一般的に言えば、上記のように、現在そのグラフの最長パスの一部ではない各ノードでDFSアルゴリズムを実行する必要があります。

このアルゴリズムの最悪の場合のシナリオは、単一のシンボルタイプで満たされたボードまたはほとんどが埋められたボードですが、ゲームでは起こりそうにありません。また、各グラフの最長パスを保存する方法にも注意してください。このビットを最適化しない場合は、ステージ上のノードごとにDFSを呼び出すだけの方が良いかもしれません。非常に大きなボードでは動作せず、その速度はそれほど大きな問題ではないと仮定すると、このソリューションは十分に高速です。

技術的に言えば、ボードを個別のグラフに分解すると、複数の「最長パスの問題」が発生します。あなたの例からわかるように、グラフにサイクルを持つことができます(たとえば、同じタイプのステージの外側にすべてのシンボルがある)、この特定の問題では、最長のパスを見つける必要があることを意味しますいくつかの巡回無向グラフでは、多項式時間では実行できません

これが遅すぎる場合、個々の「最長パスの問題」を最適化する方法の詳細については、StackOverflowのこの回答を参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.