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

โปรแกรมค้นหาสตริงที่เล็กที่สุดในพจนานุกรมเพื่อย้ายจากจุดเริ่มต้นไปยังปลายทางใน Python


สมมติว่าเราอยู่ที่ตำแหน่ง (0, 0) ในระนาบคาร์ทีเซียน เราต้องการไปยังจุด (x, y) โดยใช้การเคลื่อนไหวในแนวนอน (H) และแนวตั้ง (V) ของหน่วยเดียวเท่านั้น มีหลายวิธีที่จะไปถึงจุดหมายได้ แต่ละวิธีประกอบด้วยท่า H ไม่กี่ท่าและท่า V ไม่กี่ท่า (ตัวอย่างเช่น หากเราต้องการไปที่จุด (2,2) จากจุด (0,0) ดังนั้น HVVH ก็เป็นหนึ่งในวิธีที่เป็นไปได้) หากเรามีค่าอื่น k เราจะต้องหาค่า kth ที่เล็กที่สุดของ lexicographically ไปสู่ที่หมาย

ดังนั้น หากอินพุตเป็นแบบ (x, y) =(3, 3) k =3 เอาต์พุตจะเป็น "HHVVVH"

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

  • กำหนดฟังก์ชัน path() นี่จะใช้เวลา x, y
  • ถ้า min(x, y) <0 แล้ว
    • คืน 0
  • คืนค่า factorial(x+y)/factorial(x)/factorial(y)
  • จากวิธีหลัก ให้ทำดังนี้ -
  • res :=รายการใหม่
  • (p, q) :=(0, 0)
  • ในขณะที่ (p, q) ไม่เหมือนกับ (x, y) do
    • n :=เส้นทาง(x - p - 1, y - q)
    • ถ้า p + 1 <=x และ k
    • ใส่ 'H' ต่อท้าย res
    • p :=p + 1
  • มิฉะนั้น
    • k :=k - n
    • ใส่ 'V' ต่อท้าย res
    • q :=q + 1
  • ส่งคืนอักขระ res หลังจากเข้าร่วม
  • ตัวอย่าง

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

    from math import factorial
    
    def paths(x, y):
       if min(x, y) < 0:
          return 0
       return factorial(x+y) / factorial(x) / factorial(y)
    
    def solve(x, y, k):
       res = []
       p, q = 0, 0
       while (p, q) != (x, y):
          n = paths(x - p - 1, y - q)
          if p + 1 <= x and k < n:
             res.append('H')
             p += 1
          else:
             k -= n
             res.append('V')
             q += 1
       return ''.join(res)
    
    (x, y) = (3, 3)
    k = 3
    print(solve(x, y, k))

    อินพุต

    (3, 3), 3
    

    ผลลัพธ์

    HHVVVH