c - Finding complete rectangles enclosing 0 -


दी गई 1000 x 1000 arrays में विविध आयतें हैं I & lt; चित्रा 1 & gt; में, धारावाहिक ???? 1a ???? पीला सेल के रूप में प्रदर्शित आयताकार का पैटर्न है & lt; चित्रा 1 & gt; में आयत का न्यूनतम आकार 3 x 3 को हरे रंग की कक्ष के रूप में प्रदर्शित किया जाता है।

कम से कम एक '' 0 '' होना चाहिए ? आयत के अंदर।

लेकिन, इस सरणी में, वहां कोई आकार या सीधे रेखा पैटर्न भी नहीं है।

 यहाँ छवि विवरण दर्ज करें

(सरणी का प्रारंभिक मान" ???? "0 है, और पैटर्न एक श्रृंखला की एक श्रृंखला का प्रतिनिधित्व करते हैं? "1 ए"। वे एक-दूसरे को ओवरलैप नहीं करते हैं या एक-दूसरे को शामिल नहीं करते हैं।)

अपरिवर्तित आकार या सीधी रेखा को छोड़कर सरणी में पूर्ण रेगटेंल्स को ढूंढने के लिए एक कुशल एल्गोरिथ्म क्या हो सकता है? उदाहरण के लिए, संपूर्ण आयतों की संख्या के ऊपर स्थित आंकड़ा 3 है

यह बहुत सरल है यदि आपके पास n वर्ग हैं, तो आप O (n) में आयतों की गणना कर सकते हैं।

मान्यताओं:

  • एक आयताकार दूसरे के अंदर है, तो आप उन्हें ढूंढने में प्रसन्न होंगे

    प्रत्येक वैध आयत की सीमाएं एक गैर-मान्य पथ के साथ किसी भी सेल को साझा नहीं करती हैं।

  • आपको इनपुट के रूप में बड़ा अतिरिक्त स्मृति की आवश्यकता होगी। चलिए इस पर जाएं को कॉल करें और 0 से प्रारंभ करें।

    आइए पहले एक सहायक फ़ंक्शन का निर्माण करें:

      is_rectangle (वर्ग s) s से, सही जब आप 1 एस देखते हैं और विज़िट किए हैं तो इन्हें 1 के रूप में चिह्नित किया जाता है, यदि 3 से कम चरण 0 से कम है, तो नीचे जाकर आप 1 एस देखते हैं और दौरा किया जाता है 0 में उन्हें 1 के रूप में चिह्नित किया जाता है अगर 3 से कम चरण में 0 लौटाते हैं, तो छोड़ें जब आप 1 एस देखते हैं और विज़िट किया जाता है तो उन्हें 1 के रूप में देखा जाता है, अगर 3 से कम चरण में 0 से वापसी की जाती है, तो जब आप 1 एस देखते हैं, तो ऊपर जाते हैं और विज़िट किए गए 0 उन्हें 1 के रूप में चिह्नित करते हैं, यदि एक ऊपर की वापसी नहीं है तो 0 वापसी 1   

    यह फ़ंक्शन मूलतः दायां-डाउन-बाएं-अप के निर्देशों में 1 एस का पता लगाता है और अगर शर्तों को पूरा किया जाता है (कम से कम 3 की लंबाई और प्रारंभिक स्थिति तक पहुंचने पर)। यह विज़िट किए गए वर्गों को भी चिह्नित करता है।

    इस फ़ंक्शन के बारे में नोटिस करना महत्वपूर्ण बात यह है कि यह सही ढंग से काम करता है, यदि प्रारंभिक वर्ग शीर्ष-बायां कोने में है।

    अब, समस्या का हल आसान है:

      num_rectangles = 0 initialize 0 (पंक्तियाँ x स्तंभ) के लिए पंक्तियों में r के लिए कॉलम में कॉलम के लिए अगर r [c] या छवि [r] [सी] == 0 जारी रखें num_rectangles + = is_rectangle (& lt; r, c & gt;) वापस num_rectangles   

    एल्गोरिथ्म कैसे कार्यान्वित होता है:

    "Https://i.stack.imgur.com/At6yQ.png" alt = "छवि विवरण यहां दर्ज करें">
    1. एक खराब आयत का असफल (और चिह्नित) भाग

    छवि विवरण यहां दर्ज करें
    2. एक आयत मिला (और चिह्नित)।

    छवि विवरण यहां दर्ज करें
    3. एक एकल वर्ग (एक ऊर्ध्वाधर पंक्ति के) में विफल

    यहां छवि विवरण दर्ज करें
    4. एक एकल वर्ग (एक ऊर्ध्वाधर पंक्ति) में विफल

    यहां छवि विवरण दर्ज करें
    5. एक एकल वर्ग (एक ऊर्ध्वाधर पंक्ति) में विफल

    छवि विवरण दर्ज करें यहां
    6. कई समान चरणों के बाद, अगले आयत को मिला।

     दर्ज करें छवि विवरण यहाँ
    7. और अगले आयत

     यहां छवि विवरण दर्ज करें
    8. एल्गोरिथम अंत

Comments

Popular posts from this blog

Python SQLAlchemy:AttributeError: Neither 'Column' object nor 'Comparator' object has an attribute 'schema' -

java - How not to audit a join table and related entities using Hibernate Envers? -

mongodb - CakePHP paginator ignoring order, but only for certain values -