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

โปรแกรมค้นหาเส้นทางด้วยความพยายามขั้นต่ำใน Python


สมมติว่าเรามีเมทริกซ์ 2 มิติของคำสั่ง m x n ที่เรียกว่าความสูง heights[i][j] หมายถึงความสูงของเซลล์ (i, j) ถ้าเราอยู่ที่เซลล์ (0, 0) เราต้องการเดินทางไปยังเซลล์ด้านล่างขวา (m-1, n-1) เราสามารถเลื่อนขึ้น ลง ซ้าย หรือขวาได้ และเราต้องการหาเส้นทางที่ต้องใช้ความพยายามน้อยที่สุด ในปัญหานี้ ความพยายามในการรูทคือความแตกต่างสูงสุดของความสูงระหว่างเซลล์สองเซลล์ที่ต่อเนื่องกันของเส้นทาง ในที่สุด เราก็ต้องหาความพยายามขั้นต่ำที่จำเป็นในการเดินทางไปยังจุดหมายปลายทาง

ดังนั้นหากอินพุตเป็นแบบ

2 3 4
4 9 5
6 4 6

จากนั้นผลลัพธ์จะเป็น 1 เนื่องจากเส้นทางคือ [2,3,4,5,6] มีความแตกต่างแน่นอนสูงสุด 1 ในเซลล์ที่ต่อเนื่องกัน

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • r :=จำนวนแถวที่มีความสูง c:=จำนวนคอลัมน์ที่มีความสูง
  • queue:=คิวเริ่มเก็บ tuple (0,0,0)
  • ขณะที่คิวไม่ว่างให้ทำ
    • cur:=รายการแรกของคิวและลบออกจากคิว
    • c_eff:=cur[0]
    • x:=cur[1]
    • y:=cur[2]
    • ถ้า x เหมือนกับ r-1 และ y เหมือนกับ c-1 แล้ว
      • ส่งคืน c_eff
    • ถ้า heights[x, y] เป็นสตริงว่าง ดังนั้น
      • ติดตามตอนต่อไป
    • สำหรับแต่ละ dx,dy ใน [[1,0],[-1,0],[0,1],[0,-1]] ทำ
      • newx :=x+dx
      • ใหม่ :=y+dy
      • ถ้า 0 <=newx
      • eff :=สูงสุดของ c_eff และ |heights[newx,newy] - heights[x,y]|
      • แทรก tuple (eff, newx, newy) ลงในคิว
  • ความสูง[x, y]:=สตริงว่าง

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

import heapq
def solve(heights):
   r,c=len(heights),len(heights[0])
   queue=[(0,0,0)]

   while queue:

      cur=heapq.heappop(queue)
      c_eff=cur[0]
      x=cur[1]
      y=cur[2]

      if x==r-1 and y==c-1:
         return c_eff

      if heights[x][y]=="":
         continue

      for dx,dy in [[1,0],[-1,0],[0,1],[0,-1]]:
         newx=x+dx
         newy=y+dy
         if 0<=newx<r and 0<=newy<c and heights[newx][newy]!="":

            eff = max(c_eff, abs(heights[newx][newy] - heights[x][y]))
            heapq.heappush(queue,(eff, newx, newy))

      heights[x][y]=""

matrix = [[2,3,4],[4,9,5],[6,4,6]]
print(solve(matrix))

อินพุต

[[2,3,4],[4,9,5],[6,4,6]]

ผลลัพธ์

1