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

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


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

इसलिए, यदि इनपुट इस प्रकार है:

0000
0100
0110
0000

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

हल करने के चरण

  • R := मैट्रिक्स की पंक्तियों की संख्या, C := मैट्रिक्स के स्तंभों की संख्या

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

  • tin := एक नया मैप, low := एक नया मैप

  • timer := 0

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

  • par := एक नया मैप

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

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

  • dfs() फ़ंक्शन परिभाषित करें। यह v, parent लेगा

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

    • par[v] := parent, tin[v] := timer, low[v] := timer

    • timer := timer + 1

    • children := 0

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

      • यदि to, parent के समान है, तो अगले इटरेशन पर जाएं

      • यदि to विज़िटेड है, तो low[v] := low[v] और tin[to] का न्यूनतम

      • अन्यथा, dfs(to, v), low[v] := low[v] और low[to] का न्यूनतम

      • यदि low[to] >= tin[v] और parent null नहीं है, तो v को bridge_pts में जोड़ें

      • children := children + 1

    • यदि parent null है और children > 1, तो v को bridge_pts में जोड़ें

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

    • Q := root वाले सिंगल एलिमेंट सूची के साथ एक डबल एंडेड क्यू

    • visited := एक नया सेट और प्रारंभ में root डालें

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

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

      • यदि v, tgt के समान है, तो True लौटाएं

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

        • यदि w विज़िटेड नहीं है, तो w को विज़िटेड के रूप में चिह्नित करें और Q के बाएं में डालें

    • False लौटाएं

  • मुख्य विधि से निम्नलिखित करें:

    • dfs(src, null)

    • यदि tgt, par में नहीं है, तो 0 लौटाएं

    • bridge_pts में प्रत्येक जोड़ी (i, j) के लिए, matrix[i, j] := 1 करें

    • यदि bfs(src) true है, तो 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 + j2), तो Mat

  1. - Python प्रोग्राम - स्ट्रिंग में विशिष्ट सबस्ट्रिंग की संख्या गिनें

    एक स्ट्रिंग s दी गई है, हमें s के विशिष्ट गैर-खाली सबस्ट्रिंग की संख्या खोजनी है। उदाहरण इनपुट: s = abaa आउटपुट: 8 व्याख्या: सबस्ट्रिंग हैं [a, b, ab, ba, aa, aba, baa, abaa]। एल्गोरिदम (ट्राई/प्रीफिक्स ट्री) trie := {} (खाली डिक्शनरी) n := len(s) i 0 से n-1 तक: curr := trie j i से n-1

  1. पायथन में ऐरे में x से बड़े सभी वैल्यूज को फ़िल्टर करने का प्रोग्राम पायथन में ऐरे में x से बड़े सभी वैल्यूज को फ़िल्टर करने का प्रोग्राम

    मान लीजिए हमारे पास nums नामक संख्याओं की सूची है। हमारे पास x नामक एक और संख्या भी है। हमें nums से उन सभी नंबरों को फ़िल्टर करके ढूंढना है जो x से कम हैं। पायथन में filter() मेथड होता है जो फंक्शन को आर्गुमेंट के रूप में लेता है और इस फंक्शन का उपयोग करके फ़िल्टर करता है। तो, यदि इनपुट nums = [1,5