Innanzitutto, possiamo convertire i rettangoli di origine in celle nella griglia sottostante, per rendere l'input più uniforme. (Rasterizzare efficacemente il problema)
Questo ci consentirà di trovare ottimizzazioni che potrebbero non essere ovvie quando si lavora direttamente con i rettangoli di origine, in particolare quando si tratta di dividere più rettangoli di origine per ricombinarli in modo diverso.
Successivamente possiamo trovare regioni connesse dello stesso colore, usando algoritmi di approfondimento o riempimento di inondazioni. Possiamo considerare isolatamente ogni regione connessa (un poliomino ) - nulla di ciò che facciamo in una regione diversa deve influenzare questa.
In effetti, vogliamo trovare un modo per sezionare questo poliomino in rettangoli (sfortunatamente la maggior parte della letteratura che riesco a trovare riguarda il problema opposto: dissezionare rettangoli in poliomino! Ciò rende difficile la ricerca di indizi ...)
Un metodo semplice è quello di combinare percorsi orizzontali di quadrati adiacenti in lunghi rettangoli sottili. Quindi possiamo confrontare con la riga sopra e combinare se la nostra corsa inizia e finisce coincidono - o quando finiamo ogni corsa / riga, o quando consideriamo ogni cella da aggiungere alla corsa corrente.
Non so ancora quanto questo metodo si avvicini all'ottimale. Sembra che possa incorrere in un po 'di problemi quando una riga che non ha ancora considerato suggerisce una divisione diversa rispetto alle righe che ha visto finora:
Rilevare quando una corsa / rettangolo è esattamente coperta da corse sopra e sotto, quindi dividerla e fonderle risolverà questo caso particolare, ma non ho esplorato quanto sia generale il problema.
Ho anche esaminato i metodi in cui percorriamo il perimetro del poliomino e lo attraversiamo ogni volta che incontriamo un angolo concavo, ma questo approccio mi sembra più soggetto a errori. Ottenere risultati ottimali sembra richiedere la priorità di taglio che unisce due angoli concavi e le forme che contengono cavità richiedono una gestione speciale, quindi il metodo di scansione delle righe sembra avere il vantaggio della semplicità.
Un altro metodo che sto guardando è quello di prendere la prima corsa trovata nella riga superiore ed estenderla il più lontano possibile. Quindi prendi la prima manche nella prima fila di ciò che rimane ... Questo però si inciampa su forme a T invertite, quindi non è neanche ottimale.
Sento che probabilmente c'è un modo per usare la programmazione dinamica per trovare la divisione ottimale, ma non l'ho ancora trovato.