Je ne suis pas certain, mais je suis presque sûr que cela pourrait être résolu de manière avide. Vous essayez de réduire le nombre de champs de couleur à 1, donc réduire plus de champs de couleur plus tôt ne devrait pas être moins efficace que réduire moins plus tôt.
1) Définir une collection de groupes existants de même couleur.
2) Pour chaque collection, comptez le nombre de collections voisines par couleur. Le plus grand nombre de collections voisines d'une même couleur est le poids de cette collection.
3) Prenez la collection avec le plus grand nombre de voisins d'une même couleur, et remplissez-la de cette couleur. Fusionnez les collections, et mettez à jour le tri pour toutes les collections affectées par la fusion (tous les nouveaux voisins de la collection fusionnée).
Globalement, je pense que le calcul devrait se faire en O(n log n), où n est le nombre de pixels et où le log(n) provient uniquement du maintien de la liste triée des poids.
Je ne suis pas sûr qu'il soit nécessaire d'établir un critère d'égalité lorsque plusieurs champs ont le même poids. Peut-être que la couleur commune au plus grand nombre de groupes sur la carte est déterminante.
Quoi qu'il en soit, notez que le but du jeu est de réduire le nombre de champs de couleurs distinctes et non de maximiser le périmètre, car différents schémas de couleurs peuvent parfois faire d'un champ plus grand un choix sous-optimal. Considérons le champ :
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
La couleur 1 a le plus grand périmètre, quelle que soit la mesure, mais la couleur 2 est le choix optimal.
EDIT>
Grattez ça. L'exemple :
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
Invalide mon propre algorithme gourmand. Mais je ne suis pas convaincu qu'il s'agisse d'une simple traversée de graphe, puisque le passage à une couleur partagée par 2 voisins visite 2 et non 1.
L'élimination des couleurs devrait probablement jouer un certain rôle dans l'heuristique.
1) Il n'est jamais correct de remplir avec une couleur qui n'est pas déjà sur le graphique.
2) S'il y a un champ de couleur avec une couleur unique, au moins un remplissage sera nécessaire pour lui. Il ne peut pas être regroupé avec d'autres remplissages. Je pense que cela signifie qu'il est prudent de le remplir plus tôt que tard.
3) L'algorithme gourmand pour le comptage des champs voisins a du sens pour une carte à 2 couleurs.
1 votes
Le problème semble être NP-hard : Lien vers l'université de Bristol