สมมติว่าเรามีเวกเตอร์สามตัว x, y และ z ในระนาบ 2 มิติ เราต้องตรวจสอบว่าเราสามารถหาเวกเตอร์ y จากเวกเตอร์ x ได้หรือไม่โดยหมุนมัน 90 องศา (ตามเข็มนาฬิกา) หรือบวก z กับมันกี่ครั้งก็ได้ตามต้องการ
ดังนั้น หากอินพุตเป็น x =(-4, -2) y =(-1, 2) z =(-2, -1) ผลลัพธ์จะเป็น True เนื่องจากเราสามารถเพิ่ม z ด้วย x เพื่อรับตำแหน่ง (-2, -1) แล้วหมุน 90° ตามเข็มนาฬิกาเพื่อให้ได้ (-1, 2)
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
กำหนดฟังก์ชัน util() นี่จะใช้เวลา p, q, r, s
- d :=r * r + s * s
- ถ้า d เหมือนกับ 0 แล้ว
- คืนค่า จริง เมื่อ p และ q ทั้งคู่เป็น 0 มิฉะนั้น เท็จ
- คืนค่าเป็นจริงเมื่อ (p * r + q * s) และ (q * r - p * s) หารด้วย d ลงตัว ไม่เช่นนั้นเท็จ
- จากวิธีหลัก ให้ทำดังนี้ -
- ถ้ามี util(x ของ p - x ของ q, y ของ p - y ของ q, x ของ r, y ของ r) หรือ util(x ของ p + x ของ q, y ของ p + q[ 1], x ของ r, y ของ r) หรือ util(x ของ p - y ของ q, y ของ p + x ของ q, x ของ r, y ของ r) หรือ util(x ของ p + y ของ q, y ของ p - x ของ q, x ของ r, y ของ r) เป็นจริง จากนั้น
- คืนค่า True
- คืนค่าเท็จ
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
def util(p, q, r, s): d = r * r + s * s if d == 0: return p == 0 and q == 0 return (p * r + q * s) % d == 0 and (q * r - p * s) % d == 0 def solve(p,q,r): if util(p[0] - q[0], p[1] - q[1], r[0], r[1]) or util(p[0] + q[0], p[1] + q[1], r[0], r[1]) or util(p[0] - q[1], p[1] + q[0], r[0], r[1]) or util(p[0] + q[1], p[1] - q[0], r[0], r[1]): return True return False p = (-4, -2) q = (-1, 2) r = (-2, -1) print(solve(p, q, r))
อินพุต
(-4, -2), (-1, 2), (-2, -1)
ผลลัพธ์
True