İlk olarak, girdiyi daha homojen hale getirmek için kaynak dikdörtgenlerinizi alttaki ızgaradaki hücrelere dönüştürebiliriz. (Sorunu etkin bir şekilde rasterleştirmek)
Bu, doğrudan kaynak dikdörtgenlerle çalışırken, özellikle de bunları farklı şekilde yeniden birleştirmek için birden fazla kaynak dikdörtgeninin bölünmesini gerektirdiğinde belirgin olmayabilecek optimizasyonları bulmamıza olanak tanır.
Daha sonra, derinlik-ilk arama veya taşkın doldurma algoritmaları kullanarak aynı renkteki bağlı bölgeleri bulabiliriz. Her bağlantılı bölgeyi (bir poliomino ) tek başına düşünebiliriz - farklı bir bölgeye yaptığımız hiçbir şeyin bu bölgeyi etkilemesi gerekmez.
Etkili bir şekilde bu polyominoyu dikdörtgenlere ayırmanın bir yolunu bulmak istiyoruz (maalesef bulabileceğim literatürün çoğu karşı problemle ilgili: dikdörtgenleri poliominolara ayırmak! Bu, olası satışları araştırmayı zorlaştırıyor ...)
Basit bir yöntem, bitişik karelerin yatay çalışmalarını uzun sıska dikdörtgenlerde birleştirmektir. Daha sonra yukarıdaki satıra kıyasla karşılaşabiliriz ve çalışma başlangıç ve bitişlerimiz eşleşirse birleştirebiliriz - her bir çalışmayı / satırı bitirirken veya her hücrenin geçerli çalışmaya eklenmesini düşündüğümüz gibi.
Bu yöntemin ne kadar optimum hale geldiğini henüz bilmiyorum. Henüz dikkate almadığı bir satır, şimdiye kadar gördüğü satırlardan farklı bir bölünme önerdiğinde biraz sorun yaşayabilir:
Bir çalışma / dikdörtgenin tam olarak yukarıdaki ve altındaki çalışmalarla kapandığını algılamak, sonra bölmek ve birleştirmek bu özel durumu çözecektir, ancak sorunun ne kadar genel olduğunu araştırmadım.
Ayrıca, poliominonun çevresini yürüdüğümüz ve içbükey bir köşeyle karşılaştığımızda her zaman kestiğimiz yöntemlere baktım, ancak bu yaklaşım bana daha fazla hataya eğilimli görünüyor. En iyi sonuçları elde etmek için, iki içbükey köşeyi birleştiren kesimlere öncelik verilmesini gerektiriyor ve oyuk içeren şekiller özel işlem gerektiriyor, bu nedenle satır tarama yönteminin basitlik avantajı var gibi görünüyor.
Baktığım bir yöntem daha üst satırda bulunan ilk koşuyu alıp olabildiğince uzağa uzatmak. Daha sonra, kalanın üst satırındaki ilk koşuyu alın ... Bu, ters T şekillerinde tetiklenir, bu yüzden de optimal değildir.
İdeal bölmeyi bulmak için muhtemelen dinamik programlama kullanmanın bir yolu olduğunu hissediyorum, ancak henüz bulamadım.