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

पायथन में मैट्रिक्स पर चौड़ाई पहली खोज

किसी दिए गए मैट्रिक्स में, तत्व की स्थिति का विश्लेषण करने के लिए चार ऑब्जेक्ट हैं:बाएँ, दाएँ, नीचे और ऊपर।

Breadth First Search किसी दिए गए 2-D मैट्रिक्स के दो तत्वों के बीच सबसे छोटी दूरी खोजने के अलावा और कुछ नहीं है। इस प्रकार, प्रत्येक सेल में, चार ऑपरेशन होते हैं जिन्हें हम कर सकते हैं जिन्हें चार अंकों में व्यक्त किया जा सकता है जैसे,

  • '2' वर्णन करता है कि मैट्रिक्स में सेल स्रोत है।
  • '3' वर्णन करता है कि मैट्रिक्स में सेल गंतव्य है।
  • '1' वर्णन करता है कि सेल को एक दिशा में आगे ले जाया जा सकता है।
  • '0' वर्णन करता है कि मैट्रिक्स में सेल को किसी भी दिशा में नहीं ले जाया जा सकता है।

एडोब औचित्य के आधार पर, हम किसी दिए गए मैट्रिक्स पर एक चौड़ाई पहले खोज ऑपरेशन कर सकते हैं।

इस समस्या को हल करने का तरीका

संपूर्ण मैट्रिक्स को पार करने और BFS का उपयोग करके किसी भी सेल के बीच न्यूनतम या सबसे छोटी दूरी खोजने के लिए एल्गोरिथ्म इस प्रकार है:

  • पहले पंक्ति और कॉलम का इनपुट लें।
  • दी गई पंक्ति और स्तंभ के साथ एक मैट्रिक्स प्रारंभ करें।
  • एक पूर्णांक फ़ंक्शन shortestDist(int row, int col, int mat[][col]) इनपुट के रूप में रो, कॉलम और मैट्रिक्स को लेता है और मैट्रिक्स के तत्वों के बीच सबसे छोटी दूरी लौटाता है।
  • स्रोत के साथ-साथ गंतव्य तत्व का पता लगाने के लिए चर स्रोत और गंतव्य को प्रारंभ करें।
  • यदि तत्व '3' है, तो इसे गंतव्य के रूप में चिह्नित करें और यदि तत्व '2' है, तो इसे स्रोत तत्व के रूप में चिह्नित करें।
  • अब दिए गए मैट्रिक्स पर ब्रेडथ फर्स्ट सर्च को लागू करने के लिए क्यू डेटा संरचना को इनिशियलाइज़ करें।
  • मैट्रिक्स की पंक्ति और स्तंभ को कतार में जोड़े के रूप में सम्मिलित करें। अब सेल में घूमें और पता करें कि यह डेस्टिनेशन सेल है या नहीं। यदि गंतव्य सेल की दूरी वर्तमान सेल से न्यूनतम या कम है, तो दूरी को अपडेट करें।
  • वर्तमान सेल से सेल की न्यूनतम दूरी ज्ञात करने के लिए फिर से दूसरी दिशा में जाएं।
  • न्यूनतम दूरी को आउटपुट के रूप में लौटाएं।

उदाहरण

import queue
INF = 10000
class Node:
   def __init__(self, i, j):
      self.row_num = i
      self.col_num = j
def findDistance(row, col, mat):
   source_i = 0
   source_j = 0
   destination_i = 0
   destination_j = 0
   for i in range(0, row):
      for j in range(0, col):
         if mat[i][j] == 2 :
            source_i = i
            source_j = j
         if mat[i][j] == 3 :
            destination_i = i
            destination_j = j
   dist = []
   for i in range(0, row):
      sublist = []
      for j in range(0, col):
         sublist.append(INF)
      dist.append(sublist)
   # initialise queue to start BFS on matrix
   q = queue.Queue()
   source = Node(source_i, source_j)
   q.put(source)
   dist[source_i][source_j] = 0

   # modified BFS by add constraint checks
   while (not q.empty()):
       # extract and remove the node from the front of queue
      temp = q.get()
      x = temp.row_num
      y = temp.col_num

      # If move towards left is allowed or it is the destnation cell
      if y - 1 >= 0 and (mat[x][y - 1] == 1 or mat[x][y - 1] == 3) :
      # if distance to reach the cell to the left is less than the computed previous path distance, update it
         if dist[x][y] + 1 < dist[x][y - 1] :
            dist[x][y - 1] = dist[x][y] + 1
            next = Node(x, y - 1)
            q.put(next)

      # If move towards right is allowed or it is the destination cell
      if y + 1 < col and (mat[x][y + 1] == 1 or mat[x][y + 1] == 3) :
         # if distance to reach the cell to the right is less than the computed previous path distance, update it
         if dist[x][y] + 1 < dist[x][y + 1] :
            dist[x][y + 1] = dist[x][y] + 1
            next = Node(x, y + 1)
            q.put(next);

      # If move towards up is allowed or it is the destination cell
      if x - 1 >= 0 and (mat[x - 1][y] == 1 or mat[x-1][y] == 3) :
         # if distance to reach the cell to the up is less than the computed previous path distance, update it
         if dist[x][y] + 1 < dist[x - 1][y] :
            dist[x - 1][y] = dist[x][y] + 1
            next = Node(x - 1, y)
            q.put(next)

      # If move towards down is allowed or it is the destination cell
      if x + 1 < row and (mat[x + 1][y] == 1 or mat[x+1][y] == 3) :
         # if distance to reach the cell to the down is less than the computed previous path distance, update it
         if dist[x][y] + 1 < dist[x + 1][y] :
            dist[x + 1][y] = dist[x][y] + 1
            next = Node(x + 1, y)
            q.put(next)
   return dist[destination_i][destination_j]

row = 5
col = 5
mat = [ [1, 0, 0, 2, 1],
      [1, 0, 2, 1, 1],
      [0, 1, 1, 1, 0],
      [3, 2, 0, 0, 1],
      [3, 1, 0, 0, 1] ]

answer = findDistance(row, col, mat);
if answer == INF :
   print("No Path Found")
else:
   print("The Shortest Distance between Source and Destination is:")
   print(answer)

आउटपुट

The Shortest Distance between Source and Destination is:2

  1. ग्राफ़ के लिए चौड़ाई पहली खोज (बीएफएस)

    ब्रेडथ फर्स्ट सर्च (बीएफएस) ट्रैवर्सल एक एल्गोरिथम है, जिसका उपयोग किसी दिए गए ग्राफ के सभी नोड्स पर जाने के लिए किया जाता है। इस ट्रैवर्सल एल्गोरिथम में एक नोड का चयन किया जाता है और फिर सभी आसन्न नोड्स को एक-एक करके देखा जाता है। आसन्न सभी शीर्षों को पूरा करने के बाद, यह एक और शीर्ष की जाँच करने क

  1. ग्राफ़ के लिए चौड़ाई पहली खोज या बीएफएस

    चौड़ाई पहली खोज (बीएफएस) ट्रैवर्सल एक एल्गोरिथम है, जिसका उपयोग किसी दिए गए ग्राफ़ के सभी नोड्स पर जाने के लिए किया जाता है। इस ट्रैवर्सल एल्गोरिथम में एक नोड का चयन किया जाता है और फिर सभी आसन्न नोड्स को एक-एक करके देखा जाता है। आसन्न सभी शीर्षों को पूरा करने के बाद, यह एक और शीर्षों की जाँच करने क

  1. पायथन में एक मैट्रिक्स को स्थानांतरित करें?

    एक मैट्रिक्स को स्थानांतरित करने का मतलब है कि हम इसके कॉलम को इसकी पंक्तियों में बदल रहे हैं। आइए इसे एक उदाहरण से समझते हैं कि अगर ट्रांसपोज़ के बाद कैसा दिखता है। मान लें कि आपके पास मूल मैट्रिक्स कुछ इस तरह है - x = [[1,2][3,4][5,6]] उपरोक्त मैट्रिक्स x में हमारे पास दो कॉलम हैं, जिनमें 1, 3,