सबसे पहले, हम आपके स्रोत के आयतों को आपके अंतर्निहित ग्रिड में कोशिकाओं में बदल सकते हैं, ताकि इनपुट को अधिक समान बनाया जा सके। (प्रभावी रूप से समस्या को तेज करते हुए)
इससे हमें ऐसे अनुकूलन मिलेंगे, जो प्रत्यक्ष रूप से स्रोत आयतों के साथ काम करते समय स्पष्ट नहीं हो सकते हैं - विशेषकर तब जब इसमें अलग-अलग तरह से पुनर्संयोजन करने के लिए कई स्रोत आयतों को विभाजित करना शामिल होता है।
अगला हम गहराई-पहले-खोज या बाढ़ भरने वाले एल्गोरिदम का उपयोग करके एक ही रंग के जुड़े क्षेत्रों को पा सकते हैं। हम प्रत्येक जुड़े क्षेत्र (एक पॉलोमिनो) पर विचार कर सकते हैं अलगाव में ) - कुछ भी नहीं जो हम एक अलग क्षेत्र में करते हैं उसे इस पर प्रभाव डालने की आवश्यकता है।
प्रभावी रूप से हम इस पॉलोमिनो को आयतों में विभाजित करने का एक तरीका ढूंढना चाहते हैं (दुर्भाग्य से अधिकांश साहित्य जो मुझे मिल सकता है, वह विपरीत समस्या के बारे में है: आयतों को पॉलीओमीनो में विभाजित करना! इससे लीड की खोज करना मुश्किल हो जाता है ...
एक सीधी विधि आसन्न वर्गों के क्षैतिज रन को लंबी स्कीनी आयतों में संयोजित करना है। फिर हम ऊपर की पंक्ति के खिलाफ तुलना कर सकते हैं और जोड़ सकते हैं यदि हमारा रन शुरू और समाप्त होता है - या तो हम प्रत्येक रन / पंक्ति को समाप्त करते हैं, या जैसा कि हम प्रत्येक सेल को वर्तमान रन में जोड़ने पर विचार करते हैं।
मुझे अभी तक नहीं पता है कि यह तरीका कितना करीबी है। ऐसा लगता है कि यह थोड़ी परेशानी में पड़ सकता है जब एक पंक्ति जिस पर अभी तक विचार नहीं किया गया है वह अब तक देखी गई पंक्तियों की तुलना में एक अलग विभाजन का सुझाव देती है:
पता चलता है कि जब एक रन / आयत बिल्कुल ऊपर और नीचे के रनों द्वारा कवर किया जाता है, तो इसे विभाजित करने और उन्हें विलय करने से यह विशेष मामला हल हो जाएगा, लेकिन मैंने यह नहीं पता लगाया है कि समस्या कितनी सामान्य है।
मैंने उन तरीकों पर भी ध्यान दिया है जहां हम पॉलीओमिनो की परिधि पर चलते हैं, और जब भी हम एक अवतल कोने से टकराते हैं, तब तक काटा जाता है, लेकिन यह दृष्टिकोण मुझे अधिक त्रुटि वाला लगता है। इष्टतम परिणाम प्राप्त करने के लिए प्राथमिकता वाले कटौती की आवश्यकता होती है जो दो अवतल कोनों में शामिल होते हैं, और खोखले वाले आकृतियों को विशेष हैंडलिंग की आवश्यकता होती है, इसलिए पंक्ति स्कैन विधि में सादगी लाभ होता है।
एक और तरीका जो मैं देख रहा हूं वह है शीर्ष पंक्ति में पाया गया पहला रन लेना और जहाँ तक आप यह कर सकते हैं नीचे तक बढ़ाएँ। फिर जो बचा है उसकी शीर्ष पंक्ति में पहला रन लें ... यह उल्टे टी आकार पर ट्रिप-अप हो जाता है, इसलिए यह या तो इष्टतम नहीं है।
मुझे लगता है कि इष्टतम विभाजन को खोजने के लिए गतिशील प्रोग्रामिंग का उपयोग करने का एक तरीका शायद है, लेकिन मैंने अभी तक इसे नहीं पाया है।