Computer >> Máy Tính >  >> Lập trình >> Python

Tìm chuỗi rắn có độ dài tối đa bằng Python

Giả sử chúng ta có một lưới các số; chúng ta phải tìm một chuỗi con rắn và trả lại nó. Nếu có nhiều chuỗi con rắn, thì chỉ trả về một con. Như chúng ta biết, một dãy con rắn được tạo ra bằng cách sử dụng các số liền kề trong lưới, vì vậy đối với mỗi số, số ở bên phải hoặc số bên dưới nó là +1 hoặc -1 giá trị của nó. Vì vậy, nếu giá trị hiện tại nằm trong ô lưới (a, b), chúng ta có thể di chuyển sang phải (a, b + 1) nếu số đó là ± 1 hoặc di chuyển xuống dưới (a + 1, b) nếu số đó là ± 1.

Vì vậy, nếu đầu vào giống như

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

thì đầu ra sẽ là 6, dãy - 10 (0, 0) đến 9 (1, 0) đến 8 (1, 1) đến 7 (1, 2) đến 6 (1, 3) đến 7 (2, 3) đến 8 (3, 3)

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Định nghĩa một hàm get_path (). Điều này sẽ lấy lưới, mat, i, j

  • path:=a new list

  • pt:=a point [i, j]

  • chèn pt vào cuối đường dẫn

  • trong khi lưới [i, j] không phải là 0, do

    • nếu i> 0 và lưới [i, j] -1 giống với lưới [i-1, j] thì

      • pt:=[i-1, j]

      • chèn pt vào cuối đường dẫn

      • i:=i - 1

    • ngược lại khi j> 0 và lưới [i, j] -1 giống với lưới [i, j-1] thì

      • pt:=[i, j-1]

      • chèn pt vào cuối đường dẫn

      • j:=j - 1

  • đường dẫn trở lại

  • Từ phương thức chính, thực hiện như sau -

  • lookup:=tạo một lưới kích thước M x N và điền bằng 0

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

  • đối với tôi trong phạm vi từ 0 đến M, hãy thực hiện

    • đối với j trong phạm vi từ 0 đến N, thực hiện

      • nếu tôi hoặc j khác 0, thì

        • if (i> 0 an and | grid [i-1, j] - grid [i, j] | is 1, then

          • tra cứu [i, j] =tối đa tra cứu [i, j], tra cứu [i-1, j] + 1)

          • nếu length_max

            • length_max:=lookup [i, j]

            • max_row:=i

            • max_col:=j

        • if (j> 0 and | grid [i, j-1] - grid [i, j] | is 1, then

          • nếu length_max

          • tra cứu [i, j] =tối đa tra cứu [i, j], tra cứu [i, j-1] + 1)

            • length_max:=lookup [i, j]

            • max_row:=i

            • max_col:=j

  • hiển thị length_max

  • path:=get_path (tra cứu, lưới, max_row, max_col)

  • in tất cả các phần tử trong đường dẫn theo thứ tự ngược lại

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn &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)

Đầu vào

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

Đầu ra

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]