確かではありませんが、これが貪欲に解決できることはかなり確信しています。カラー フィールドの数を 1 に減らそうとしているので、より多くのカラー フィールドを先に減らしても、以前に減らした場合よりも効率が低下することはありません。
1) 既存の同色グループのコレクションを定義します。
2) コレクションごとに、隣接するコレクションの数を色別に数えます。単一の色を持つ隣接するコレクションの最大数は、このコレクションの重みです。
3) 単一の色の隣接点の数が最も多いコレクションを取得し、その色で塗りつぶします。コレクションをマージし、マージによって影響を受けるすべてのコレクション (マージされたコレクションのすべての新しい隣接) の並べ替えを更新します。
全体として、これは実際には O(n log n) 時間で計算する必要があると思います。ここで、n はピクセル数で、log(n) はソートされた重みのリストを維持することからのみ得られます。
ただし、複数のフィールドの重みが同じ場合にタイブレーカーが必要かどうかはわかりません。おそらく、タイブレーカーは、マップ上のほとんどのグループに共通する色になります.
いずれにせよ、ゲームの目的は異なるカラー フィールドの数を減らすことであり、周囲を最大化することではないことに注意してください。さまざまなカラー スキームによって、より大きなフィールドが次善の選択となる場合があるからです。次のフィールドを検討してください。
3 3 3 3 3
1 1 1 1 1
1 1 1 1 1
2 2 2 2 2
1 2 2 2 2
色 1 の周囲の長さはどの尺度よりも大きくなりますが、色 2 が最適な選択です。
編集>
それをスクラッチします。例:
3 1 3 1 3
1 1 1 1 1
1 1 1 1 1
2 2 2 2 2
1 2 2 2 2
私自身の貪欲なアルゴリズムを無効にします。しかし、2 つの隣人が共有する色に変更すると1 つではなく2 つのノードにアクセスするため、これが単純なグラフ トラバーサルであるとは確信できません。
色の除去は、おそらくヒューリスティックで何らかの役割を果たすはずです。
1) グラフにまだない色で塗りつぶすことは決して正しくありません。
2) 固有の色を持つカラー フィールドが 1 つある場合、少なくとも 1 つの塗りつぶしが必要になります。他のフィルとの同梱はできません。これは、遅かれ早かれそれを埋めるのが安全であることを意味すると思います。
3) 隣接フィールド カウントの貪欲なアルゴリズムは、2 色マップに適しています。