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

पायथन में अधिकतम लंबाई सांप अनुक्रम खोजें

मान लीजिए हमारे पास संख्याओं का एक ग्रिड है; हमें एक सांप अनुक्रम ढूंढना है और उसे वापस करना है। यदि कई साँप अनुक्रम हैं, तो केवल एक ही लौटाएँ। जैसा कि हम जानते हैं कि ग्रिड में आसन्न संख्याओं का उपयोग करके एक सांप अनुक्रम बनाया जाता है, इसलिए प्रत्येक संख्या के लिए, दाईं ओर की संख्या या उसके नीचे की संख्या या तो +1 या -1 होती है। इसलिए, यदि वर्तमान मान ग्रिड सेल (ए, बी) में है, तो हम या तो दाएं (ए, बी + 1) को स्थानांतरित कर सकते हैं यदि वह संख्या ± 1 है या नीचे जा सकती है (ए + 1, बी) यदि वह संख्या ± 1 है।

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

10 7 6 3
9 8 7 6
8 4 2 7
2 2 2 8

तो आउटपुट 6 होगा, अनुक्रम - 10 (0, 0) से 9 (1, 0) से 8 (1, 1) से 7 (1, 2) से 6 (1, 3) से 7 (2, 3) से 8 (3, 3)

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

  • एक फ़ंक्शन को परिभाषित करें get_path() । यह ग्रिड, मैट, i, j

    . लेगा
  • पथ:=एक नई सूची

  • पीटी:=एक बिंदु [i, j]

  • पथ के अंत में पीटी डालें

  • जबकि ग्रिड [i, j] 0 नहीं है, करें

    • अगर i> 0 और ग्रिड [i, j]-1 ग्रिड [i-1, j] के समान है, तो

      • पीटी:=[आई-1, जे]

      • पथ के अंत में पीटी डालें

      • मैं :=मैं - 1

    • अन्यथा जब j> 0 और ग्रिड[i, j]-1 ग्रिड [i, j-1] के समान है, तब

      • पीटी:=[मैं, जे-1]

      • पथ के अंत में पीटी डालें

      • जे:=जे - 1

  • वापसी पथ

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

  • लुकअप :=आकार M x N का ग्रिड बनाएं और 0 से भरें

  • length_max :=0, max_row :=0, max_col :=0

  • मैं के लिए 0 से एम की सीमा में, करो

    • j के लिए 0 से N की सीमा में, करें

      • अगर i या j गैर-शून्य है, तो

        • अगर (i> 0 an और |grid[i-1, j] - grid[i, j]| 1 है तो

          • लुकअप[i,j] =अधिकतम लुकअप[i,j],लुकअप[i-1,j] + 1)

          • अगर length_max <लुकअप[i,j], तो

            • length_max :=लुकअप[i, j]

            • max_row :=i

            • max_col :=j

        • अगर (j> 0 और |grid[i, j-1] - grid[i, j]| 1 है तो

          • अगर length_max <लुकअप[i][j] शून्य नहीं है, तो

          • लुकअप[i,j] =अधिकतम लुकअप[i,j],लुकअप[i,j-1] + 1)

            • length_max :=लुकअप[i, j]

            • max_row :=i

            • max_col :=j

  • लंबाई_मैक्स प्रदर्शित करें

  • पथ:=get_path (लुकअप, ग्रिड, max_row, max_col)

  • पथ में सभी तत्वों को उल्टे क्रम में प्रिंट करें

उदाहरण

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

M = 4
N = 4
def get_path(grid, mat, i, j):
   path = list()
   pt = [i, j]
   path.append(pt)
   while (grid[i][j] != 0):
      if (i > 0 and grid[i][j]-1 == grid[i-1][j]):
         pt = [i-1, j]
         path.append(pt)
         i -= 1
      elif (j > 0 and grid[i][j]-1 == grid[i][j-1]):
         pt = [i, j-1]
         path.append(pt)
         j -= 1
   return path
def get_sequence(grid):
   lookup = [[0 for i in range(N)] for j in range(M)]
   length_max = 0
   max_row = 0
   max_col = 0
   for i in range(M):
      for j in range(N):
         if (i or j):
            if (i > 0 and
               abs(grid[i-1][j] - grid[i][j]) == 1):
                  lookup[i][j] = max(lookup[i][j],lookup[i-1][j] + 1)
                  if (length_max < lookup[i][j]):
                     length_max = lookup[i][j]
                     max_row = i
                     max_col = j
                  if (j > 0 and
                     abs(grid[i][j-1] - grid[i][j]) == 1):
                     lookup[i][j] = max(lookup[i][j],lookup[i][j-1] + 1)
                     if (length_max < lookup[i][j]):
                        length_max = lookup[i][j]
                        max_row = i
                        max_col = j
   print("Maximum length:", length_max)
   path = get_path(lookup, grid, max_row, max_col)
   print("Sequence is:")
   for ele in reversed(path):
   print(grid[ele[0]][ele[1]], " [", ele[0], ", ", ele[1], "]", sep = "")
grid = [
   [10, 7, 6, 3],
   [9, 8, 7, 6],
   [8, 4, 2, 7],
   [2, 2, 2, 8]]
get_sequence(grid)

इनपुट

[[10, 7, 6, 3],
[9, 8, 7, 6],
[8, 4, 2, 7],
[2, 2, 2, 8]]

आउटपुट

Maximum length: 6
Sequence is:
10 [0, 0]
9 [1, 0]
8 [1, 1]
7 [1, 2]
6 [1, 3]
7 [2, 3]
8 [3, 3]

  1. पायथन में सबसे लंबी मैट्रिक्स पथ लंबाई की लंबाई खोजने का कार्यक्रम

    मान लीजिए हमारे पास एक बाइनरी मैट्रिक्स है, जहां 0 खाली सेल को इंगित करता है और 1 दीवार को इंगित करता है। हम पहली पंक्ति पर किसी भी खाली सेल से शुरू कर सकते हैं और अंतिम पंक्ति पर किसी भी खाली सेल पर समाप्त करना चाहते हैं। हम बाएँ, दाएँ या नीचे जा सकते हैं, हमें सबसे लंबा ऐसा रास्ता खोजना होगा जहाँ

  1. पायथन में समान लंबाई के k रिबन की अधिकतम लंबाई खोजने का कार्यक्रम

    मान लीजिए कि हमारे पास सकारात्मक संख्याओं की एक सूची है, जो रिबन की लंबाई का प्रतिनिधित्व करती है और एक मान k भी है। हम जितनी बार चाहें रिबन काट सकते हैं, हमें सबसे बड़ी लंबाई r ढूंढनी होगी जैसे कि हमारे पास लंबाई r के k रिबन हो सकें। अगर हमें ऐसा समाधान नहीं मिल रहा है, तो -1 पर लौटें। इसलिए, यदि

  1. पायथन में अधिकतम भवन ऊंचाई खोजने का कार्यक्रम

    मान लीजिए कि हमारे पास एक मान n है और जोड़े की एक और सूची है जिसे प्रतिबंध कहा जाता है। हम एक शहर में नई इमारतें बनाना चाहते हैं। लेकिन कुछ प्रतिबंध हैं। हम एक लाइन में बना सकते हैं और इमारतों को 1 से n तक लेबल किया जाता है। प्रतिबंधों के दो पैरामीटर हैं, इसलिए प्रतिबंध [i] =(id_i, max_height_i) इंग