Bài 1.15 Các hình chữ nhật

Một phần của tài liệu Các bài toán về đoạn thẳng (Trang 38 - 39)

ACM Trên mặt phẳng tọa độ cho N hình chữ nhật (HCN) có diện tích khác 0 và có các cạnh song song với các trục tọa độ. Mỗi HCN được mô tả bằng bộ bốn số nguyên (x1,y1) và (x2,y2) biểu thị tọa độ nguyên của hai đỉnh đối diện.

Yêu cầu: xác định diện tích phần mặt phẳng bị các HCN phủ.

HCN.INP HCN.OUT Dữ liệu vào: tệp văn bản HCN.INP

Dòng đầu tiên: số tự nhiên 1 < N 1000.

Dòng thứ i trong N dòng tiếp theo, mỗi dòng chứa 4 số nguyên x1, y1, x2, y2 cách nhau qua dấu cách.

Dữ liệu ra: tệp văn bản HCN.OUT chứa tổng đơn vị diện tích trên mặt phẳng bị các HCN phủ. 5 0 0 2 4 1 2 4 6 5 3 3 7 4 1 6 5 7 3 9 0 35 Thuật toán Phương pháp: Tham. y 2 A B

1. Đọc dữ liệu và chỉnh lại các tọa độ sao cho

x1  x2 và y1  y2. Điều này có nghĩa là ta qui ước mọi HCN ABCD đều được xác định qua 2 đỉnh đối diện D (đỉnh Tây-Nam)

và B (đỉnh Đông-Bắc): D(x1, y1), B(x2, y2).

Khi đọc dữ liệu ta đồng thời lược bớt các giá trị y trùng lặp và sắp các giá trị y1 và y2 theo chiều tăng để ghi vào một mảng y[1..m]. Như vậy, giá trị lớn nhất của m là 2n. Ta gọi phần

mặt phẳng giới hạn bởi hai đường thẳng song song với trục hoành và cắt trục tung tại điểm y[i] và y[i+1] là

băng i. Ta có m1 băng mã số từ 1 đến m1. Băng đầu tiên có mã số 1 nằm giữa hai đường y[1] và y[2],

băng cuối cùng có mã số m1 nằm giữa hai đường y[m1] và y[m]. Nhiệm vụ còn lại là tính diện tích bị phủ trên mỗi băng. Tổng số diện tích bị phủ của các băng sẽ là đáp số cho bài toán.

2. Ta lại sắp các HCN theo chiều tăng của tọa độ x1.

3. Với mỗi HCN h(x1, y1, x2, y2) ta xét các băng i trong khoảng từ y1 đến y2. Với băng i giả sử ta đã biết phần bị các HCN 1..(h1) phủ trên băng này. Ta kí hiệu s[i] và e[i] là giới hạn hoành độ trái và phải của phần đang bị phủ trên băng i. Diện tích hiện bị phủ trên băng i sẽ là: (y[i+1]y[i])*(e[i] – s[i]), trong đó y[i+1] – y[i] là chiều rộng của băng i. Ta cần chỉnh lại phần bị phủ trong băng i khi xét thêm HCN h(x1, y1, x2, y2). Dễ thấy, nếu x1 nằm giữa s[i] và e[i] thì ta cần chỉnh lại e[i] theo công thức e[i] := max(e[i], x2).

Ngược lại, nếu x1 > e[i] thì ta kết thúc làn (s[i],e[i]) này như sau: Tính diện tích làn này và đưa vào biến tích lũy diện tích dt sau đó đặt lại cận s[i] := x1; e[i] := x2.

Do các hoành độ y1 và y2 được sắp tăng nên ta có thể gọi thủ tục tìm kiếm nhị phân BínSearch để xác định băng chứa y1.

Độ phức tạp: Các thuật toán sắp xếp và chèn đòi hỏi tối đa N2, Thủ tục xử lí xét mỗi HCN 1 lần và

duyệt 2n băng. Tổng hợp: N2

.

(* Pascal *)

(********************************************** Cac hinh chu nhat Cac hinh chu nhat

*********************************************) program HinhChuNhat; program HinhChuNhat;

uses crt;

const mn = 2001; fn = 'HCN.INP'; gn = 'HCN.OUT'; bl = #32; nl = #13#10; type CN = record x1, y1: integer; x2, y2: integer; end; mcn1 = array[0..mn] of CN; mi1 = array[0..mn] of integer; var

n,m: integer; { n - so HCN, m - so lan } h: mcn1; { cac HCN }

Một phần của tài liệu Các bài toán về đoạn thẳng (Trang 38 - 39)

Tải bản đầy đủ (PDF)

(48 trang)