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

โปรแกรมนับจำนวนเส้นทางที่มีค่าใช้จ่าย k จากจุดเริ่มต้นไปยังจุดสิ้นสุดใน Python


สมมติว่าเรามีเมทริกซ์ไบนารี 2d และอีกค่าหนึ่งคือ k เริ่มจากเซลล์ด้านซ้ายบน เราต้องไปที่เซลล์ขวาล่าง ในขั้นตอนเดียวเราลงไปได้เท่านั้นหรือถูกต้อง ตอนนี้คะแนนของพาธคือผลรวมของค่าในเซลล์บนพาธ เราต้องหาจำนวนเส้นทางจากเซลล์เริ่มต้นไปยังเซลล์สิ้นสุดด้วยคะแนน k หากมีวิธีที่เป็นไปได้มากมาย ให้คืนค่า mod ผลลัพธ์ 10^9+7

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

0 0 1
1 0 1
0 1 0

K =2 แล้วเอาท์พุตจะเป็น 4 เนื่องจากเส้นทางที่มีคะแนน 2 คือ [R,R,D,D], [D,R,R,D], [D,D,R,R], [D ,R,D,R] ที่นี่ D อยู่ด้านล่าง และ R อยู่ด้านขวา

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

  • deno :=10^9 + 7

  • m :=จำนวนแถวของเมทริกซ์ n :=จำนวนคอลัมน์ของเมทริกซ์

  • กำหนดฟังก์ชัน dfs() นี่จะใช้เวลา i, j, pts

  • ถ้า i>=m หรือ j>=n แล้ว

    • คืนค่า 0

  • pts :=pts + matrix[i, j]

  • ถ้าฉันเหมือนกับ m - 1 และ j เหมือนกับ n - 1 แล้ว

    • คืนค่า 1 เมื่อ pts เหมือนกับ k มิฉะนั้น 0

  • ส่งคืน dfs(i + 1, j, pts) + dfs(i, j + 1, pts)

  • จากวิธีหลัก ให้ทำดังต่อไปนี้ −

  • ส่งคืน dfs(0, 0, 0) mod deno

ตัวอย่าง

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

class Solution:
   def solve(self, matrix, k):
      m, n = len(matrix), len(matrix[0])
      def dfs(i=0, j=0, pts=0):
         if i >= m or j >= n:
            return 0
         pts += matrix[i][j]
         if i == m - 1 and j == n - 1:
            return int(pts == k)
         return dfs(i + 1, j, pts) + dfs(i, j + 1, pts)
      return dfs() % (10 ** 9 + 7)

ob = Solution()
matrix = [
   [0, 0, 1],
   [1, 0, 1],
   [0, 1, 0]
]
k = 2
print(ob.solve(matrix, k))

อินพุต

[
   [0, 0, 1],
   [1, 0, 1],
   [0, 1, 0]
], 2

ผลลัพธ์

4