Я не уверен, но я вполне уверен, что это можно решить с жадностью. Вы пытаетесь уменьшить количество цветовых полей до 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 является оптимальным выбором.
EDIT>
Поцарапайте это. Пример:
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.
Устранение цвета, вероятно, должно играть определенную роль в эвристике.
1) Никогда не правильно заполнять цветом, которого еще нет на графике.
2) Если есть одно поле цвета с уникальным цветом, для него потребуется как минимум одна заливка. Он не может быть связан с другими заполнениями. Я думаю, это означает, что заполнять его безопасно раньше, чем позже.
3) Жадный алгоритм подсчета соседних полей имеет смысл для двухцветной карты.