Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Python

पायथन में ऊपरी-बाएँ और नीचे-दाएँ कोशिकाओं को विभाजित करने के लिए आवश्यक दीवारों की संख्या की गणना करने का कार्यक्रम

मान लीजिए कि हमारे पास 2d बाइनरी मैट्रिक्स है जहां 0 खाली सेल का प्रतिनिधित्व करता है और 1 दीवार का प्रतिनिधित्व करता है। हमें न्यूनतम संख्या वाली कोशिकाओं को खोजना होगा जिन्हें दीवार बनने की आवश्यकता है ताकि ऊपर-बाएं सेल और नीचे-दाएं सेल के बीच कोई रास्ता न हो। हम दीवारों को ऊपर-बाएं सेल और नीचे-दाएं सेल पर नहीं रख सकते हैं। हम केवल बाएँ, दाएँ, ऊपर और नीचे जा सकते हैं तिरछे नहीं।

तो, अगर इनपुट पसंद है

0 0 0 0
0 1 0 0
0 1 1 0
0 0 0 0

तो आउटपुट 2 होगा,

0 1 0 0
0 1 0 0
0 1 1 0
0 0 1 0

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • आर:=मैट्रिक्स की पंक्ति गणना, सी:=मैट्रिक्स की कॉलम गणना

  • विज़िट किया गया :=एक नया सेट

  • टिन:=एक नया नक्शा, कम:=एक नया नक्शा

  • टाइमर:=0

  • Bridge_pts :=एक नया सेट

  • बराबर:=एक नया नक्शा

  • src :=एक जोड़ी (0, 0)

  • tgt :=एक जोड़ी (R - 1, C - 1)

  • फ़ंक्शन को परिभाषित करें dfs() । यह वी, माता-पिता को लेगा

  • v को विज़िट किया गया के रूप में चिह्नित करें

  • par[v]:=पैरेंट, टिन[v]:=टाइमर, कम[v]:=टाइमर

  • टाइमर:=टाइमर + 1

  • बच्चे :=0

  • v के प्रत्येक पड़ोसियों के लिए, करें

    • यदि to माता-पिता के समान है, तो

      • अगले पुनरावृत्ति के लिए जाएं

    • अगर जाना है, तो

      • निम्न [v] :=न्यूनतम निम्न[v] और टिन[से]

    • अन्यथा,

      • dfs(to, v)

      • निम्न [v] :=न्यूनतम निम्न[v] और निम्न[से]

      • अगर कम [से]>=टिन[v] और पैरेंट शून्य नहीं है, तो

        • v को Bridge_pts में जोड़ें

      • बच्चे :=बच्चे + 1

  • यदि माता-पिता अशक्त हैं और बच्चे> 1 हैं, तो

    • v को Bridge_pts में जोड़ें

  • फ़ंक्शन को परिभाषित करें bfs() । यह जड़ लेगा

  • प्रश्न:=एकल तत्व रूट वाली सूची के साथ एक डबल एंडेड कतार

  • विज़िट किया गया :=एक नया सेट और प्रारंभ में रूट डालें

  • जबकि Q खाली नहीं है, करें

    • v:=Q का अंतिम तत्व, फिर Q से अंतिम तत्व को हटा दें

    • अगर v tgt के समान है, तो

      • सही लौटें

    • v के पड़ोसियों में प्रत्येक w के लिए, करें

      • अगर w का दौरा नहीं किया जाता है, तो

        • w को विज़िट किया गया के रूप में चिह्नित करें

        • Q के बाईं ओर w डालें

  • झूठी वापसी

  • मुख्य विधि से निम्न कार्य करें -

  • dfs(src, null)

  • अगर tgt बराबर नहीं है, तो

    • वापसी 0

  • ब्रिज_पीटी में प्रत्येक जोड़ी (i, j) के लिए, करें

    • मैट्रिक्स [i, j] :=1

  • अगर bfs(src) सही है, तो

    • वापसी 2

  • वापसी 1

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

from collections import deque
class Solution:
   def solve(self, matrix):
      R = len(matrix)
      C = len(matrix[0])
      def get_neighbors(i, j):
         for ii, jj in ((i + 1, j), (i− 1, j), (i, j + 1), (i, j − 1)):
            if 0 <= ii < R and 0 <= jj < C and matrix[ii][jj] == 0:
               yield ii, jj
      visited = set()
      tin = {}
      low = {}
      timer = 0
      bridge_pts = set()
      par = {}
      src = (0, 0)
      tgt = (R− 1, C− 1)
      def dfs(v, parent):
         nonlocal timer
         visited.add(v)
         par[v] = parent
         tin[v] = timer
         low[v] = timer
         timer += 1
         children = 0
         for to in get_neighbors(*v):
            if to == parent:
               continue
            if to in visited:
               low[v] = min(low[v], tin[to])
            else:
               dfs(to, v)
               low[v] = min(low[v], low[to])
               if low[to] >= tin[v] and parent is not None:
                  bridge_pts.add(v)
               children += 1
               if parent is None and children > 1:
                  bridge_pts.add(v)
               def bfs(root):
                  Q = deque([root])
                  visited = set([root])
                  while Q:
                     v = Q.pop()
                     if v == tgt:
                        return True
                     for w in get_neighbors(*v):
                        if w not in visited:
                           visited.add(w)
                           Q.appendleft(w)
                  return False
               dfs(src, None)
               if tgt not in par:
                  return 0
               for i, j in bridge_pts:
                  matrix[i][j] = 1
               if bfs(src):
                  return 2
               return 1
ob = Solution()
matrix = [
   [0, 0, 0, 0],
   [0, 1, 0, 0],
   [0, 1, 1, 0],
   [0, 0, 0, 0],
]
print(ob.solve(matrix))

इनपुट

[
   [0, 0, 0, 0],
   [0, 1, 0, 0],
   [0, 1, 1, 0],
   [0, 0, 0, 0],
]

आउटपुट

2

  1. पायथन में संभावित विनम्र मैट्रिक्स की संख्या गिनने का कार्यक्रम

    मान लीजिए हमारे पास दो मान n और m हैं। हमें क्रम n x m के विनम्र आव्यूहों की संभावित व्यवस्थाओं की संख्या ज्ञात करनी है। मैट्रिक्स को विनम्र कहा जाता है जब इसमें प्रत्येक तत्व 1 से n x ​​m की श्रेणी में बिल्कुल एक बार होता है किन्हीं दो सूचकांक जोड़े (i1, j1) और (i2, j2) के लिए, यदि (i1 + j1) <(i2

  1. पायथन में एस में अलग-अलग सबस्ट्रिंग की संख्या गिनने का कार्यक्रम

    मान लीजिए कि हमारे पास एक स्ट्रिंग s है, हमें s के अलग-अलग गैर-रिक्त सबस्ट्रिंग की संख्या ज्ञात करनी है। इसलिए, यदि इनपुट s =abaa जैसा है, तो आउटपुट 8 होगा, क्योंकि सबस्ट्रिंग [a, b, ab, ba, aa, aba, बा, आबा]। इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - कोशिश करें:=एक नया नक्शा n :=आकार का

  1. पायथन में n नोड्स के साथ BST की संख्या गिनने का कार्यक्रम

    मान लीजिए कि हमारे पास अलग-अलग नोड हैं। सभी अलग हैं। हमें यह पता लगाना है कि हम उन्हें कितने तरीकों से व्यवस्थित कर सकते हैं ताकि हम बाइनरी सर्च ट्री बना सकें। जैसा कि हम बाइनरी सर्च ट्री के बारे में जानते हैं, लेफ्ट सबट्री में हमेशा छोटे मान होते हैं और राइट सबट्री में बड़े मान होते हैं। इसे हल कर