สมมติว่าเรามีตารางตัวเลข เราต้องหาลำดับงูและส่งคืน หากมีลำดับของงูหลายชุด ให้ส่งคืนชุดเดียว อย่างที่เราทราบกันดีว่าลำดับของงูถูกสร้างขึ้นโดยใช้ตัวเลขที่อยู่ติดกันในตาราง ดังนั้นสำหรับตัวเลขแต่ละตัว ตัวเลขทางด้านขวามือหรือตัวเลขด้านล่างจะเป็น +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]