Hàm tính khoảng cách Minkowski

View as PDF

Time limit: 1.0s , Memory limit: 256M , Points: 1

Khoảng cách Minkowski trong không gian 3 chiều

Cho hai điểm \(A(x₁, y₁, z₁)\) và \(B(x₂, y₂, z₂)\) trong không gian 3 chiều. Khoảng cách Minkowski bậc p giữa chúng là:

\(d_p(A, B) = ( |x₁ - x₂|^p + |y₁ - y₂|^p + |z₁ - z₂|^p )^{1/p}\) với p \ge 1

Đây là một "họ" khoảng cách, tùy giá trị p mà ta được các khoảng cách quen thuộc:

  • p = 1: Khoảng cách Manhattan \(|x₁ - x₂| + |y₁ - y₂| + |z₁ - z₂|\)
  • p = 2: Khoảng cách Euclid
  • \(p = ∞\): Khoảng cách Chebyshev \(max(|x₁ - x₂|, |y₁ - y₂|, |z₁ - z₂|)\)

Lưu ý: Nếu p < 1 thì công thức trên không còn là một khoảng cách hợp lệ, khi đó in ra Khong hop le.


Yêu cầu:

Viết chương trình Python nhập vào hai điểm và nhiều giá trị p, với mỗi p in ra khoảng cách Minkowski bậc p giữa hai điểm. Bắt buộc chia chương trình thành các hàm sau:

Hàm Tham số Giá trị trả về
hieu_tuyet_doi(u, v) hai số thực u, v giá trị |u - v|
minkowski(x1, y1, z1, x2, y2, z2, p=2) tọa độ hai điểm và số thực p (mặc định p = 2) khoảng cách Minkowski bậc p (giả sử p hữu hạn và p ≥ 1)
chebyshev(x1, y1, z1, x2, y2, z2) tọa độ hai điểm khoảng cách Chebyshev
khoang_cach(x1, y1, z1, x2, y2, z2, p) tọa độ hai điểm và số thực p khoảng cách bậc p; trả về None nếu p < 1; dùng chebyshev nếu p là vô cùng

Yêu cầu thêm:

  • minkowskichebyshev phải gọi lại hàm hieu_tuyet_doi để tính độ lệch trên từng trục.
  • khoang_cach là hàm duy nhất được gọi trực tiếp từ main; nó chịu trách nhiệm chọn hàm phù hợp để tính.

Gợi ý: Python nhận được vô cùng bằng float("inf"), và kiểm tra bằng math.isinf(p).

Khung chương trình gợi ý:

import math

def hieu_tuyet_doi(u, v):
    # TODO
    pass

def minkowski(x1, y1, z1, x2, y2, z2, p=2):
    # TODO
    pass

def chebyshev(x1, y1, z1, x2, y2, z2):
    # TODO
    pass

def khoang_cach(x1, y1, z1, x2, y2, z2, p):
    # TODO
    pass

def main():
    x1, y1, z1 = map(float, input().split())
    x2, y2, z2 = map(float, input().split())
    q = int(input())
    for i in range(q):
        p = float(input())
        # TODO: gọi khoang_cach và in kết quả

main()

Input:

  • Dòng thứ nhất chứa ba số thực \(x₁, y₁, z₁\) là tọa độ điểm A.
  • Dòng thứ hai chứa ba số thực \(x₂, y₂, z₂\) là tọa độ điểm B.
  • Dòng thứ ba chứa số nguyên q (1 \le q \le 20) là số truy vấn.
  • q dòng tiếp theo, mỗi dòng chứa một giá trị p: hoặc là số thực (-10 \le p \le 100), hoặc là chữ inf (nghĩa là vô cùng).

Các tọa độ thỏa mãn |x|, |y|, |z| \le 100.


Output:

  • Với mỗi truy vấn, in ra một dòng chứa khoảng cách bậc p giữa AB, làm tròn đến 3 chữ số thập phân.
  • Nếu p < 1 thì in:
Khong hop le

Ví dụ

Sample Input 1
1 2 3
4 6 8
4
1
2
3
inf
Sample Output 1
12.000
7.071
6.000
5.000
Sample Input 2
0 0 0
1 1 1
2
0.5
2
Sample Output 2
Khong hop le
1.732

Comments