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

ตรวจสอบว่าถึงตำแหน่ง Target ได้โดยกระโดดระยะ d1, d2 หรือไม่ และหา Minimum Steps ด้วย Python


เริ่มที่ p กระโดดซ้าย/ขวา d1, d2 หา Min Steps ไป q

เช่น Input p = 5, q = 10, d1 = 4, d2 = 3 Output 3 (Right 4, Right 4 -> 13, Left 3 -> 10)

ขั้นตอนแก้ (BFS):

  • GCD(d1,d2) ต้องหาร (p-q) ลงตัว มิฉะนั้น -1
  • BFS จาก p ด้วย Queue เก็บ (position, steps)
  • Visited Set ป้องกันซ้ำ
  • Expand: pos ± d1, pos ± d2

ตัวอย่างโค้ด

from math import gcd
from collections import deque

def solve(p, d1, d2, q):
    gcd_res = gcd(d1, d2)
    if (p - q) % gcd_res != 0:
        return -1
    que = deque()
    visited = set()
    que.appendleft([p, 0])
    visited.add(p)
    while len(que) > 0:
        pair = que.pop()
        point, step = pair[0], pair[1]
        if point == q:
            return step
        if point + d1 not in visited:
            que.appendleft([(point + d1), step + 1])
            visited.add(point + d1)
        if point + d2 not in visited:
            que.appendleft([(point + d2), step + 1])
            visited.add(point + d2)
        if point - d1 not in visited:
            que.appendleft([(point - d1), step + 1])
            visited.add(point - d1)
        if point - d2 not in visited:
            que.appendleft([(point - d2), step + 1])
            visited.add(point - d2)

p = 5
q = 10
d1 = 4
d2 = 3
print(solve(p, d1, d2, q))

Input

5, 4, 3, 10

Output

True