Tout d'abord, nous pouvons convertir vos rectangles source en cellules dans votre grille sous-jacente, pour rendre l'entrée plus uniforme. (Rastériser efficacement le problème)
Cela nous permettra de trouver des optimisations qui pourraient ne pas être évidentes lorsque vous travaillez directement avec les rectangles source - en particulier lorsqu'il s'agit de fractionner plusieurs rectangles source pour les recombiner différemment.
Ensuite, nous pouvons trouver des régions connectées de la même couleur, en utilisant des algorithmes de recherche en profondeur en premier ou de remplissage par inondation. Nous pouvons considérer chaque région connectée (un polyomino ) isolément - rien de ce que nous faisons à une région différente n'a besoin d'influencer celle-ci.
En effet, nous voulons trouver un moyen de disséquer ce polyomino en rectangles (malheureusement, la plupart de la littérature que je peux trouver concerne le problème opposé: disséquer des rectangles en polyominos! Cela rend la recherche de pistes difficile ...)
Une méthode simple consiste à combiner des parcours horizontaux de carrés adjacents en longs rectangles maigres. Ensuite, nous pouvons comparer avec la ligne ci-dessus et combiner si nos débuts et fins de course correspondent - soit lorsque nous terminons chaque course / ligne, soit lorsque nous considérons que chaque cellule s'ajoute à la course actuelle.
Je ne sais pas encore à quel point cette méthode est optimale. Il semble qu'il puisse rencontrer quelques problèmes lorsqu'une ligne qu'il n'a pas encore envisagée suggère une division différente de celle des lignes qu'il a vues jusqu'à présent:
Détecter quand une course / un rectangle est exactement couvert par des courses au-dessus et en dessous, puis le diviser et les fusionner résoudra ce cas particulier, mais je n'ai pas exploré à quel point le problème est général.
J'ai également examiné les méthodes permettant de parcourir le périmètre du polyomino et de couper à chaque fois que nous rencontrons un coin concave, mais cette approche me semble plus sujette aux erreurs. L'obtention de résultats optimaux semble nécessiter de hiérarchiser les coupes qui joignent deux coins concaves, et les formes contenant des creux nécessitent une manipulation spéciale, de sorte que la méthode de balayage des lignes semble avoir l'avantage de la simplicité.
Une autre méthode que je regarde est de prendre la première manche trouvée dans la rangée du haut et de l'étendre aussi loin que possible. Ensuite, faites la première course dans la rangée supérieure de ce qui reste ... Cela se déclenche cependant sur les formes en T inversé, donc ce n'est pas optimal non plus.
J'ai l'impression qu'il y a probablement un moyen d'utiliser la programmation dynamique pour trouver la répartition optimale, mais je ne l'ai pas encore trouvée.