Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ค้นหาลำดับงูที่มีความยาวสูงสุดใน Python


สมมติว่าเรามีตารางตัวเลข เราต้องหาลำดับงูและส่งคืน หากมีลำดับของงูหลายชุด ให้ส่งคืนชุดเดียว อย่างที่เราทราบกันดีว่าลำดับของงูถูกสร้างขึ้นโดยใช้ตัวเลขที่อยู่ติดกันในตาราง ดังนั้นสำหรับตัวเลขแต่ละตัว ตัวเลขทางด้านขวามือหรือตัวเลขด้านล่างจะเป็น +1 หรือ -1 ค่าของมัน ดังนั้น หากค่าปัจจุบันอยู่ในเซลล์กริด (a, b) เราสามารถเลื่อนไปทางขวา (a, b+1) ถ้าตัวเลขนั้นเป็น ± 1 หรือย้ายไปที่ด้านล่าง (a+1, b) ถ้าตัวเลขนั้นเป็น ± 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() นี่จะใช้กริด, เสื่อ, ฉัน, เจ

  • เส้นทาง :=รายการใหม่

  • pt :=จุด [i, j]

  • แทรก pt ที่ส่วนท้ายของเส้นทาง

  • ในขณะที่ grid[i, j] ไม่ใช่ 0, do

    • ถ้า i> 0 และ grid[i, j]-1 เหมือนกับ grid[i-1, j] แล้ว

      • pt :=[i-1, j]

      • แทรก pt ที่ส่วนท้ายของเส้นทาง

      • ผม :=ผม - 1

    • มิฉะนั้น เมื่อ j> 0 และ grid[i, j]-1 เหมือนกับ grid[i, j-1] แล้ว

      • pt :=[i, j-1]

      • แทรก pt ที่ส่วนท้ายของเส้นทาง

      • เจ :=เจ - 1

  • เส้นทางกลับ

  • จากวิธีหลัก ให้ทำดังนี้ −

  • ค้นหา :=สร้างตารางขนาด M x N และเติมด้วย 0

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

  • สำหรับผมอยู่ในช่วง 0 ถึง M ทำ

    • สำหรับ j ในช่วง 0 ถึง N ให้ทำ

      • ถ้า i หรือ j ไม่ใช่ศูนย์ แล้ว

        • ถ้า (i> 0 an และ |grid[i-1, j] - grid[i, j]| คือ 1 แล้ว

          • lookup[i,j] =ค่าสูงสุดของการค้นหา[i,j],lookup[i-1,j] + 1)

          • ถ้า length_max

            • length_max :=ค้นหา[i, j]

            • max_row :=ผม

            • max_col :=เจ

        • ถ้า (j> 0 และ |grid[i, j-1] - grid[i, j]| คือ 1 แล้ว

          • ถ้า length_max

          • lookup[i,j] =ค่าสูงสุดของการค้นหา[i,j],lookup[i,j-1] + 1)

            • length_max :=ค้นหา[i, j]

            • max_row :=ผม

            • max_col :=เจ

  • จอแสดงผล length_max

  • เส้นทาง :=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]