リンクされた同一のシンボルの各グループを考慮することができる(及びリンクによって私はあなたが一つのシンボルから別のものに移動することを意味)の別々のグラフ。そのようなグラフごとに、そのグラフの最長パスの一部ではないグラフの各ノードから始まる深さ優先検索(DFS)を適用します。DFSの適用中に行き止まりに達するたびに、たった今通過したパスがこれまでに発見したグローバルな最大値よりも長いかどうかを確認します。存在する場合は、新しい最長パスとして保存します。
前の段落で、各グラフに複数回DFSを適用することに言及したことに気づくでしょう。グラフ上で単一のDFSを実行するだけでは不十分です。この特定のケースを考慮してください:
1
1 1 1
1
1
1
1
偶然、最上位ノードのこのグラフで最初にDFSを実行すると、可能な限り長いパスが垂直線であることがわかりますが、それは正しくありません。これは、結果のパス内のどこかにあるか、まったく含まれていないノードでDFSアルゴリズムを開始するたびに発生します。この特定の例で行う必要があるのは、2行目の左端のノードからDFSアルゴリズムを開始することです。それは正しいパスを見つけます。一般的に言えば、上記のように、現在そのグラフの最長パスの一部ではない各ノードでDFSアルゴリズムを実行する必要があります。
このアルゴリズムの最悪の場合のシナリオは、単一のシンボルタイプで満たされたボードまたはほとんどが埋められたボードですが、ゲームでは起こりそうにありません。また、各グラフの最長パスを保存する方法にも注意してください。このビットを最適化しない場合は、ステージ上のノードごとにDFSを呼び出すだけの方が良いかもしれません。非常に大きなボードでは動作せず、その速度はそれほど大きな問題ではないと仮定すると、このソリューションは十分に高速です。
技術的に言えば、ボードを個別のグラフに分解すると、複数の「最長パスの問題」が発生します。あなたの例からわかるように、グラフにサイクルを持つことができます(たとえば、同じタイプのステージの外側にすべてのシンボルがある)、この特定の問題では、最長のパスを見つける必要があることを意味しますいくつかの巡回無向グラフでは、多項式時間では実行できません。
これが遅すぎる場合、個々の「最長パスの問題」を最適化する方法の詳細については、StackOverflowのこの回答を参照してください。