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

Python में सभी व्यक्तियों के किसी भी सेल पर मिलने के लिए न्यूनतम चरणों की संख्या ढूंढने का प्रोग्राम


परिचय

मान लीजिए हमारे पास एक 2D मैट्रिक्स है जहां ये मान मौजूद हैं: 0 एक खाली सेल दर्शाता है। 1 एक दीवार दर्शाता है। 2 एक व्यक्ति दर्शाता है। अब एक व्यक्ति चार दिशाओं में से किसी में चल सकता है: ऊपर, नीचे, बाएं, दाएं या एक समय इकाई में स्थिर रह सकता है। हमें एक वॉकेबल सेल ढूंढना है जो सभी के मिलने में लगने वाले समय को न्यूनतम करता है और वह समय वापस करना है। ध्यान रखें कि दो लोग एक ही खाली सेल से चल सकते हैं और आप मान सकते हैं कि किन्हीं दो लोगों के बीच हमेशा कोई न कोई पथ होता है।

उदाहरण

2010
1002
2020

तो आउटपुट 2 होगा, क्योंकि सभी matrix[1, 1] पर अधिकतम 2 चरणों में मिल सकते हैं।

समाधान दृष्टिकोण

प्रत्येक व्यक्ति से BFS चलाएं ताकि सभी पहुंच योग्य सेल्स तक की दूरी मिले। फिर प्रत्येक सेल के लिए, सभी व्यक्तियों की अधिकतम दूरी लें (सबसे धीमा व्यक्ति निर्धारित करता है)। सभी सेल्स में इस अधिकतम दूरी का न्यूनतम उत्तर है।

उदाहरण कोड

class Solution:
    def solve(self, A):
        R, C = len(A), len(A[0])
        def get_neighbor(r, c):
            for nr, nc in ((r-1, c), (r, c-1), (r+1, c), (r, c+1)):
                if 0 <= nr < R and 0 <= nc < C and A[nr][nc] & 1 == 0:
                    yield nr, nc
        def bfs(r, c):
            queue = [(r, c)]
            dist = {(r, c): 0}
            for r, c in queue:
                if dist[r, c] > 15:
                    break
                for nr, nc in get_neighbor(r, c):
                    if (nr, nc) not in dist:
                        dist[nr, nc] = dist[r, c] + 1
                        queue.append((nr, nc))
            return dist
        dist = None
        for r, row in enumerate(A):
            for c, val in enumerate(row):
                if val == 2:
                    ndist = bfs(r, c)
                    if dist is None:
                        dist = ndist
                    else:
                        for key in list(dist.keys()):
                            if key in ndist:
                                dist[key] = max(dist[key], ndist[key])
                            else:
                                del dist[key]
        return min(dist.values()) if dist else 0

ob = Solution()
matrix = [
    [2, 0, 1, 0],
    [1, 0, 0, 2],
    [2, 0, 2, 0]
]
print(ob.solve(matrix))

इनपुट

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

आउटपुट

2

निष्कर्ष

मल्टी-सोर्स BFS दृष्टिकोण सभी मीटिंग पॉइंट्स के लिए न्यूनतम अधिकतम दूरी ढूंढता है। समय जटिलता O(कुल_लोगों × R × C) है। यदि आपके कोई प्रश्न हैं, तो कमेंट सेक्शन में पूछें।


  1. Python में सभी बिंदुओं को जोड़ने की न्यूनतम लागत खोजने का प्रोग्राम Python में सभी बिंदुओं को जोड़ने की न्यूनतम लागत खोजने का प्रोग्राम

    मान लीजिए हमारे पास points नामक एक ऐरे है जिसमें कुछ पॉइंट्स (x, y) के रूप में हैं। अब दो पॉइंट्स (xi, yi) और (xj, yj) को जोड़ने की लागत उनके बीच की मैनहट्टन दूरी है, सूत्र है |xi - xj| + |yi - yj|। हमें सभी पॉइंट्स को जोड़ने की न्यूनतम लागत ढूंढनी है। उदाहरण के लिए, यदि इनपुट है points = [(0,0),(

  1. Python से DAG में सभी नोड्स तक पहुंचने के लिए मिनिमम वर्टेक्स कैसे ढूंढें? Python से DAG में सभी नोड्स तक पहुंचने के लिए मिनिमम वर्टेक्स कैसे ढूंढें?

    डायरेक्टेड एसाइक्लिक ग्राफ (DAG) में जिन वर्टेक्सेज़ का इन-डिग्री 0 है, उनसे सभी नोड्स पहुंचे जा सकते हैं। एल्गोरिदम सभी नोड्स का सेट बनाएं (0 से n-1)। सभी एजेज़ के डेस्टिनेशन नोड्स (v) का सेट बनाएं। सोर्स नोड्स = सभी नोड्स - डेस्टिनेशन नोड्स (यानी इन-डिग्री 0 वाले)। यही मिनिमम वर्टेक्स सेट है। उद

  1. 8-पज़ल को हल करने के चरणों की संख्या ज्ञात करने का पायथन प्रोग्राम 8-पज़ल को हल करने के चरणों की संख्या ज्ञात करने का पायथन प्रोग्राम

    मान लीजिए हमारे पास एक 3x3 बोर्ड है जहां सभी संख्याएं 0 से 8 की रेंज में हैं और कोई दोहराव नहीं है। अब हम 0 को उसके 4 पड़ोसियों में से किसी एक के साथ स्वैप कर सकते हैं, और हम इसे हल करके सभी व्यवस्थित क्रम प्राप्त करने की कोशिश कर रहे हैं, हमें लक्ष्य तक पहुंचने के लिए आवश्यक न्यूनतम चरणों की संख्य