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

यह गिनने का कार्यक्रम कि हम कितने तरीकों से मैट्रिक्स को k टुकड़ों में पायथन में काट सकते हैं

मान लीजिए कि हमारे पास एक बाइनरी मैट्रिक्स है और दूसरा मान k है। आप मैट्रिक्स को k टुकड़ों में विभाजित करना चाहते हैं जैसे कि प्रत्येक टुकड़े में कम से कम एक 1 हो। लेकिन काटने के लिए कुछ नियम हैं, हमें क्रम में पालन करना होगा:1. एक दिशा का चयन करें:लंबवत या क्षैतिज 2. मैट्रिक्स में दो खंडों में कटौती करने के लिए एक सूचकांक का चयन करें। 3. अगर हम लंबवत काटते हैं, तो हम बाएं हिस्से को नहीं काट सकते हैं, लेकिन केवल दाएं हिस्से को काटना जारी रख सकते हैं। 4. अगर हम क्षैतिज रूप से काटते हैं, तो हम अब ऊपर के हिस्से को नहीं काट सकते हैं और केवल नीचे के हिस्से को काटना जारी रख सकते हैं। इसलिए हमें मैट्रिक्स को विभाजित करने के विभिन्न तरीकों की संख्या ज्ञात करनी होगी। अगर उत्तर बहुत बड़ा है, तो परिणाम मोड (10^9 + 7) लौटाएं।

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

1
1
0
1
0
1
1
1
1

k =2, तो आउटपुट 4 होगा, क्योंकि हम लंबवत रूप से दो बार और क्षैतिज रूप से दो बार काट सकते हैं।

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

  • p :=10^9 + 7
  • m:=मैट्रिक्स की पंक्ति गणना, n:=मैट्रिक्स की कॉलम गणना
  • गणना :=एक खाली नक्शा
  • मैं के लिए एम -1 से 0 की सीमा में, करते हैं
    • जे के लिए n - 1 से 0 की श्रेणी में, करें
      • गणना[i, j] :=मायने रखता है [i + 1, j] + मायने रखता है [(i, j + 1)] - मायने रखता है [(i + 1, j + 1)] + मैट्रिक्स [i, j]
  • फ़ंक्शन f() को परिभाषित करें। इसमें x, y, c
  • लगेगा
  • गिनती :=मायने रखता है[x, y]
  • यदि c, 0 के समान है, तो
    • गिनने पर 1 लौटाएं> 0 अन्यथा 0
  • उत्तर:=0
  • x + 1 से m-1 की श्रेणी में i के लिए
    • अगर 0 <मायने रखता है [(i, y)] <गिनती है, तो
      • उत्तर:=उत्तर + f(i, y, c - 1)
  • j के लिए y + 1 से n-1 की श्रेणी में, करें
    • अगर 0 <मायने रखता है[(x, j)] <गिनती है, तो
      • उत्तर:=उत्तर + f(x, j, c - 1)
  • वापसी उत्तर मोड पी
  • मुख्य विधि से कॉल करें और f(0, 0, k - 1) पर लौटें

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

उदाहरण

from collections import defaultdict
class Solution:
   def solve(self, matrix, k):
      p = 10 ** 9 + 7

      m, n = len(matrix), len(matrix[0])
      counts = defaultdict(int)
      for i in range(m)[::-1]:
         for j in range(n)[::-1]:
            counts[(i, j)] = (counts[(i + 1, j)] + counts[(i, j + 1)] - counts[(i + 1, j + 1)] + matrix[i][j])

      def f(x, y, c):
         count = counts[(x, y)]
         if c == 0:
            return 1 if count > 0 else 0

         ans = 0
         for i in range(x + 1, m):
            if 0 < counts[(i, y)] < count:
               ans += f(i, y, c - 1)
         for j in range(y + 1, n):
            if 0 < counts[(x, j)] < count:
               ans += f(x, j, c - 1)

         return ans % p
      return f(0, 0, k - 1)
     
ob = Solution()
matrix = [
   [1, 1, 0],
   [1, 0, 1],
   [1, 1, 1],
]
k = 2
print(ob.solve(matrix, k))

इनपुट

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

आउटपुट

4

  1. अजगर में मैट्रिक्स में घिरे द्वीपों की संख्या गिनने का कार्यक्रम

    मान लीजिए कि हमारे पास एक बाइनरी मैट्रिक्स है। जहां 1 भूमि का प्रतिनिधित्व करता है और 0 पानी का प्रतिनिधित्व करता है। जैसा कि हम जानते हैं कि एक द्वीप 1s का एक समूह है जो एक साथ समूहीकृत होता है जिसकी परिधि पानी से घिरी होती है। हमें पूरी तरह से घिरे हुए द्वीपों की संख्या ज्ञात करनी है। तो, अगर इनप

  1. पायथन में हम पेड़ को दो पेड़ों में कितने तरीकों से विभाजित कर सकते हैं, यह गिनने का कार्यक्रम

    मान लीजिए कि हमारे पास 0, 1 और 2 मान वाले बाइनरी ट्री हैं। रूट में कम से कम एक 0 नोड और एक 1 नोड है। अब मान लीजिए कि एक ऑपरेशन है जहां हम पेड़ में एक किनारे को हटाते हैं और पेड़ दो अलग-अलग पेड़ बन जाते हैं। हमें एक किनारे को हटाने के कई तरीके खोजने होंगे जैसे कि दो पेड़ों में से किसी में भी 0 नोड और

  1. एक मैट्रिक्स के स्थानान्तरण को खोजने के लिए पायथन कार्यक्रम

    इस लेख में, हम दिए गए समस्या कथन को हल करने के लिए समाधान और दृष्टिकोण के बारे में जानेंगे। समस्या कथन एक मैट्रिक्स को देखते हुए, हमें उसी मैट्रिक्स में ट्रांसपोज़ को स्टोर करना होगा और उसे प्रदर्शित करना होगा। पंक्तियों को कॉलम और कॉलम को पंक्तियों में बदलकर मैट्रिक्स का स्थानांतरण प्राप्त किया ज