Bỏ qua để đến nội dung

Điểm, khoảng cách và tích có hướng

Mức độ: Cơ bản

Bài toán hình học trong đề thi lập trình thường cho tọa độ các điểm. Thay vì vẽ hình, ta tính toán bằng các phép cộng, trừ, nhân trên tọa độ. Bí quyết quan trọng nhất: làm việc hoàn toàn bằng số nguyên khi có thể, vì số thực có sai số làm tròn.

Điểm A có tọa độ (xA, yA). Vectơ AB là “bước đi” từ A đến B: AB = (xB - xA, yB - yA).

Theo định lý Pythagore, khoảng cách AB = √((xB - xA)2 + (yB - yA)2).

Mẹo: nếu chỉ cần so sánh khoảng cách (điểm nào gần hơn), hãy so sánh bình phương khoảng cách (số nguyên), không cần lấy căn. AB nhỏ hơn AC khi và chỉ khi AB2 nhỏ hơn AC2.

Hai loại khoảng cách khác hay gặp trên lưới ô vuông:

Cách điKhoảng cách từ (0, 0) đến (3, 4)
đường chim bay√(9 + 16) = 5
chỉ đi ngang, dọc (Manhattan): |dx| + |dy|7
đi cả đường chéo như quân vua: max(|dx|, |dy|)4

Với hai vectơ u = (a, b) và v = (c, d), tích vô hướng u · v = a × c + b × d.

  • u · v = 0 khi hai vectơ vuông góc.
  • u · v dương: góc giữa chúng nhọn; u · v âm: góc tù.

Tích có hướng của u = (a, b) và v = (c, d) là u × v = a × d - b × c (một số nguyên). Đứng ở A nhìn về B, điểm C nằm:

Dấu của AB × ACC nằm ởĐi A → B → C thì
dươngbên tráirẽ trái (ngược chiều kim đồng hồ)
âmbên phảirẽ phải (cùng chiều kim đồng hồ)
bằng 0trên đường thẳng ABthẳng hàng

Ví dụ A = (0, 0), B = (4, 0), C = (1, 3): AB = (4, 0), AC = (1, 3), AB × AC = 4 × 3 - 0 × 1 = 12, dương: C ở bên trái (phía trên) đường AB.

Ý nghĩa diện tích: |AB × AC| bằng hai lần diện tích tam giác ABC. Tam giác trên có diện tích 12 / 2 = 6 (đáy 4, chiều cao 3).

def tich_co_huong(a, b, c):
# AB × AC: > 0 rẽ trái, < 0 rẽ phải, = 0 thẳng hàng
return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0])
A, B, C = (0, 0), (4, 0), (1, 3)
t = tich_co_huong(A, B, C)
print(t, abs(t) / 2) # 12 6.0

Lưu ý: với tọa độ tới 109, tích có hướng tới khoảng 4 × 1018, vẫn vừa long long, nhưng không được dùng int.

  • Ba điểm thẳng hàng: AB × AC = 0. Đây chính là phép kiểm tra đã dùng ở bài tam giác trên lưới điểm.
  • Điểm trong tam giác: P nằm trong tam giác ABC khi P nằm cùng một phía với cả ba cạnh (ba tích có hướng AB × AP, BC × BP, CA × CP cùng dấu).
  • Hai đoạn thẳng cắt nhau: đoạn AB và CD cắt nhau khi C, D nằm hai bên đường AB và A, B nằm hai bên đường CD (bài 13).

Gồm 22 bài, chia thành 4 nhóm từ dễ đến khó. Mỗi bài có một dữ liệu kiểm tra: các bạn chạy chương trình của mình với dữ liệu đó rồi so với đáp số.

Nhập tọa độ nguyên của ba điểm A, B, C (giá trị tuyệt đối ≤ 109), mỗi điểm một dòng. In ra B nếu B gần A hơn C, C nếu C gần A hơn B, BANG nếu cách đều.

Ví dụ:

NhậpIn ra
0 0
3 4
5 0
BANG

Kiểm tra: nhập

1 1
-2 5
6 2
Xem đáp số

B

Hướng dẫn giải chi tiết: liên hệ tác giả.

Một người đi trong thành phố có các con đường kẻ ô vuông, chỉ đi theo phương ngang hoặc dọc. Nhập tọa độ nguyên hai điểm (giá trị tuyệt đối ≤ 109), in ra quãng đường ngắn nhất.

Ví dụ:

NhậpIn ra
0 0
3 4
7

Kiểm tra: nhập

-5 7
12 -3
Xem đáp số

27

Hướng dẫn giải chi tiết: liên hệ tác giả.

Quân vua trên bàn cờ vô hạn mỗi bước đi sang một trong 8 ô xung quanh. Nhập tọa độ ô xuất phát và ô đích (giá trị tuyệt đối ≤ 109), in ra số bước ít nhất.

Ví dụ:

NhậpIn ra
0 0
3 4
4

Kiểm tra: nhập

-5 7
12 -3
Xem đáp số

17

Hướng dẫn giải chi tiết: liên hệ tác giả.

Dòng đầu là n (2 ≤ n ≤ 3000). n dòng tiếp theo là tọa độ nguyên các điểm (giá trị tuyệt đối ≤ 106). In ra bình phương khoảng cách nhỏ nhất giữa hai điểm.

Ví dụ:

NhậpIn ra
3
0 0
3 4
1 1
2

Kiểm tra: nhập

6
2 3
12 30
40 50
5 1
12 10
8 6
Xem đáp số

13

Hướng dẫn giải chi tiết: liên hệ tác giả.

Dòng đầu là n (n ≤ 105). n dòng tiếp theo là tọa độ nguyên các điểm (giá trị tuyệt đối ≤ 109). In ra số thứ tự (từ 1) của điểm xa gốc O(0, 0) nhất; nếu nhiều điểm cùng xa nhất thì in số nhỏ nhất.

Ví dụ:

NhậpIn ra
3
1 2
-3 1
2 -2
2

Kiểm tra: nhập

5
5 5
-7 1
0 -7
1 7
6 -4
Xem đáp số

5

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập tọa độ nguyên ba điểm A, B, C (giá trị tuyệt đối ≤ 109), mỗi điểm một dòng. Đi từ A đến B rồi đến C: in ra TRAI, PHAI hoặc THANG HANG.

Ví dụ:

NhậpIn ra
0 0
4 0
1 3
TRAI

Kiểm tra: nhập

1 1
5 3
7 2
Xem đáp số

PHAI

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập tọa độ nguyên ba đỉnh của một tam giác (giá trị tuyệt đối ≤ 109). In ra diện tích tam giác, viết đúng một chữ số sau dấu chấm (diện tích luôn có dạng số nguyên hoặc ,5).

Ví dụ:

NhậpIn ra
0 0
4 0
1 3
6.0

Kiểm tra: nhập

-3 2
5 -1
2 7
Xem đáp số

27.5

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập tọa độ nguyên ba điểm (giá trị tuyệt đối ≤ 109). In ra YES nếu ba điểm thẳng hàng, ngược lại NO.

Ví dụ:

NhậpIn ra
1 1
2 2
5 6
NO

Kiểm tra: nhập

-1000000000 -999999999
0 1
1000000000 1000000001
Xem đáp số

YES

Hướng dẫn giải chi tiết: liên hệ tác giả.

Dòng đầu là tọa độ ba đỉnh tam giác (6 số), dòng thứ hai là tọa độ điểm P (giá trị tuyệt đối ≤ 106). In ra TRONG, TREN CANH hoặc NGOAI.

Ví dụ:

NhậpIn ra
0 0 4 0 0 4
1 1
TRONG

Kiểm tra: nhập

0 0 6 0 0 6
3 3
Xem đáp số

TREN CANH

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập tọa độ nguyên ba đỉnh tam giác (không thẳng hàng, giá trị tuyệt đối ≤ 109). In ra YES nếu tam giác vuông, ngược lại NO.

Ví dụ:

NhậpIn ra
0 0
3 0
0 4
YES

Kiểm tra: nhập

1 2
4 6
8 3
Xem đáp số

YES

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập tọa độ nguyên 4 đỉnh A, B, C, D của một tứ giác theo thứ tự đi quanh (không có ba điểm thẳng hàng, các cạnh không cắt nhau). In ra LOI nếu tứ giác lồi, ngược lại LOM.

Ví dụ:

NhậpIn ra
0 0
4 0
4 4
0 4
LOI

Kiểm tra: nhập

0 0
6 0
2 2
0 6
Xem đáp số

LOM

Hướng dẫn giải chi tiết: liên hệ tác giả.

Dòng đầu là tọa độ hai đầu đoạn thẳng AB (4 số), dòng thứ hai là tọa độ điểm P (giá trị tuyệt đối ≤ 109). In ra YES nếu P nằm trên đoạn AB (kể cả hai đầu), ngược lại NO.

Ví dụ:

NhậpIn ra
0 0 4 4
2 2
YES

Kiểm tra: nhập

0 0 4 4
6 6
Xem đáp số

NO

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập tọa độ nguyên 4 điểm A, B, C, D (mỗi điểm một dòng, giá trị tuyệt đối ≤ 109). In ra YES nếu đoạn AB và đoạn CD có điểm chung, ngược lại NO.

Ví dụ:

NhậpIn ra
0 0
4 4
0 4
4 0
YES

Kiểm tra: nhập

0 0
2 2
3 3
5 1
Xem đáp số

NO

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập tọa độ nguyên hai điểm khác nhau A, B (giá trị tuyệt đối ≤ 109). In ra ba số nguyên a, b, c của phương trình đường thẳng AB dạng a × x + b × y = c, với a, b, c không có ước chung lớn hơn 1 và a dương (hoặc a = 0 và b dương).

Ví dụ:

NhậpIn ra
0 0
2 2
1 -1 0

Kiểm tra: nhập

1 3
7 -1
Xem đáp số

2 3 11

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập 4 điểm A, B, C, D (tọa độ nguyên, A khác B, C khác D, giá trị tuyệt đối ≤ 109). In ra CAT nếu đường thẳng AB và CD cắt nhau tại đúng một điểm, SONG SONG nếu song song, TRUNG nếu trùng nhau.

Ví dụ:

NhậpIn ra
0 0
1 1
0 1
1 2
SONG SONG

Kiểm tra: nhập

0 0
2 4
1 2
3 6
Xem đáp số

TRUNG

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập 4 điểm A, B, C, D (tọa độ nguyên, giá trị tuyệt đối ≤ 106), đảm bảo đường thẳng AB và CD cắt nhau. In ra tọa độ giao điểm dưới dạng hai phân số tối giản p/q (mẫu dương; nếu là số nguyên vẫn ghi mẫu 1).

Ví dụ:

NhậpIn ra
0 0
2 2
0 2
2 0
1/1 1/1

Kiểm tra: nhập

0 0
4 1
1 3
2 -1
Xem đáp số

28/17 7/17

Hướng dẫn giải chi tiết: liên hệ tác giả.

Mỗi dòng trong hai dòng là một hình chữ nhật có cạnh song song trục tọa độ, cho bởi x1 y1 x2 y2 (góc dưới trái và góc trên phải, giá trị tuyệt đối ≤ 109). In ra diện tích phần chung.

Ví dụ:

NhậpIn ra
0 0 4 3
2 1 6 5
4

Kiểm tra: nhập

-5 -5 5 5
0 -10 3 2
Xem đáp số

21

Hướng dẫn giải chi tiết: liên hệ tác giả.

Dòng đầu là n (n ≤ 105). n dòng tiếp theo là tọa độ các điểm. Dòng cuối là x1 y1 x2 y2 của một hình chữ nhật cạnh song song trục. Đếm số điểm nằm trong hoặc trên cạnh hình chữ nhật.

Ví dụ:

NhậpIn ra
4
1 1
3 5
2 2
0 7
0 0 3 3
2

Kiểm tra: nhập

6
5 5
-1 4
2 -3
0 0
3 8
4 4
-1 -3 4 5
Xem đáp số

4

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập tọa độ nguyên 4 điểm khác nhau (giá trị tuyệt đối ≤ 109, thứ tự bất kỳ). In ra YES nếu 4 điểm là 4 đỉnh của một hình vuông (có thể xoay nghiêng), ngược lại NO.

Ví dụ:

NhậpIn ra
0 0
1 1
1 0
0 1
YES

Kiểm tra: nhập

0 0
3 1
2 4
-1 3
Xem đáp số

YES

Hướng dẫn giải chi tiết: liên hệ tác giả.

Robot ở gốc tọa độ, nhận một xâu lệnh gồm N (lên), S (xuống), E (sang phải), W (sang trái), mỗi lệnh đi 1 ô (độ dài ≤ 105). In ra tọa độ cuối cùng và bình phương khoảng cách lớn nhất tới gốc mà robot đạt được trong quá trình đi.

Ví dụ: nhập NNEE thì in ra 2 2 8.

Kiểm tra: nhập NNNEESWWWWSSSE.

Xem đáp số

-1 -1 13

Hướng dẫn giải chi tiết: liên hệ tác giả.

Dòng đầu là n (3 ≤ n ≤ 105). n dòng tiếp theo là tọa độ nguyên các đỉnh đa giác theo thứ tự đi quanh, mỗi cạnh song song với một trục tọa độ. In ra chu vi.

Ví dụ:

NhậpIn ra
4
0 0
4 0
4 3
0 3
14

Kiểm tra: nhập

6
0 0
5 0
5 2
2 2
2 6
0 6
Xem đáp số

22

Hướng dẫn giải chi tiết: liên hệ tác giả.

Dòng đầu là n (1 ≤ n ≤ 1000). n dòng tiếp theo là tọa độ nguyên các điểm khác nhau. In ra số điểm nhiều nhất cùng nằm trên một đường thẳng.

Ví dụ:

NhậpIn ra
4
0 0
1 1
2 2
3 5
3

Kiểm tra: nhập

8
0 0
1 2
2 4
3 6
1 0
2 1
3 2
5 3
Xem đáp số

4

Hướng dẫn giải chi tiết: liên hệ tác giả.