สมมติว่าเราอยู่ที่ตำแหน่ง (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
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
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