Hãy đặt bút trước khi đặt tay vào bàn phím

6 669 2
Hãy đặt bút trước khi đặt tay vào bàn phím

Đang tải... (xem toàn văn)

Thông tin tài liệu

Hãy đặt bút trước khi đặt tay vào bàn phím

Hãy đặt bút trước khi đặt tay vào bàn phímNguyễn Xuân HuyBài toán 1 . (Cắt bánh,phỏng theo bài thi học sinh giỏi chuyên tin toàn quốc, khối B) Bà Tiên cho hai chị em Quyên và Phong mộtcái bánh hình chữ nhật được ghép bằng nhiều mảnh hình vuông đơn vị. Biết kíchthước cái bánh là n x m đơn vị. Chị Quyên cắt bánh theo đườngchéo. Hỏi có bao nhiêu ô bánh bị cắt, nghĩa là nhát cắt đi qua ít nhất hai điểmcủa ô (xem hình 1). Chúng ta đã gặpbài toán này trong bài 'Giải thuậtBresenham' đăng trong TH&NT số 3(6) năm 2000. Nhiều bạn đọc nói với tôirằng hình như có thể lập công thức để tính số ô vuông đơn vị bị đường chéo cắtnhưng . vấn đề có thể hơi bị khó. Chúng ta thử xem sao.Gọi f(m,n) làcông thức tính số ô bị cắt trong hình chữ nhật kích thước n x m đơn vị. Đầu tiên ta nhận thấy rằngcông thức này phải đối xứng, tức là f(m,n) = f(n,m). Một công thức hai biến xvà y, f(x,y) được gọi là đối xứng nếudạng của nó không thay đổi khi ta đổi chỗ các biến x và y cho nhau, thí dụ côngthức f(x,y) = x2 + y2 - 3xy là đối xứng vì f(y,x) = y2+ x2 - 3yx = x2 + y2 - 3xy, còn công thứcf(x,y) = x2 + y2 - 3xy + y thì không. Ta cũng thấydf(n,m)=f(dn,dm) vì theo định lý về các đoạn thẳng tỷ lệ ta có m:dm=n:dn do đósố ô bị cắt trong hình chữ nhật kích thước dn x dm sẽ gấp d lần số ô bị cắttrong hình chữ nhật kích thước n x m (xem hình 2).Giả sử n m và d làước chung lớn nhất của n và m. Đặt n' = n:d và m' = m:d. Ta xét hình chữ nhậtABCD kích thước n' x m' ô vuông đơn vị có các tọa độ đỉnh mang các giá trịnguyên. Ta thấy vì n' và m' là hai số nguyên tố cùng nhau nên trong tất cả cácđiểm có tọa độ nguyên của lưới ô vuông n' x m' chỉ có duy nhất hai điểm D và Bnằm trên đường chéo DB. Nếu đi theo đường chéo từ D đến B ta sẽ thấy đường chéocắt qua n'-1 đường thẳng đứng của lưới (không tính 2 cạnh biên). Như vậy DB cắtít nhất là n ô vuông đơn vị. Tương tự, ta cũng thấy đường chéo DB phảicắt m'-1 đường nằm ngang của lưới (không tính 2 cạnh biên). Mỗi lần cắt qua mộtcạnh ngang đường chéo DB lại cắt thêm 1 ô đơn vị nữa. Vậy số ô bị cắt thêm sẽlà m'-1. Tổng cộng đường chéo DB của hình chữ nhật ABCD kích thước n' x m' cắtn'+m'-1. Tổng hợp lại ta có f(n,m) = df(n',m') = d(n'+m'-1), trong đó d =ucln(n,m). Để ý rằng dn'=n và dm'=m, ta có f(n,m) = n+m-ucln(n,m). Đây chính làcông thức cần tìm.Chương trình CAT.PAS dưới đây triển khai hai hàm:Hàm Cat(n,m) như đã giới thiệu trong bài 'Giảithuật Bresenham' đăng trong TH&NT số 3(6) năm 2000; hàm f(n,m) theocông thức vừa tìm. Thủ tục Test tính và so sánh trị của hai hàm trên với cáccặp n và m biến thiên trong khoảng 1 50. Nếu phát hiện lỗi thì chương trình sẽthông báo.(* CAT.Pá *)Uses crt;(*------------------------------------Xem lai bai Giai thuat Bresenham trong TH&NT so 3(6) nam 2000 -------------------------------------*)Function Cat(n, m: word): word; var t, i,d: word;Beginif n > mthenbegint := m;m := n;n := t;end;t := 0; d:= m;for i := 1to m dobegint := t +n;if t >m then inc(d);if t>= m then t := t - m;end;Cat := d;End;Function ucln(n, m: word): word;var r:word;Beginwhile m<> 0 dobeginr:= nmod m; n:=m;m:=r;end;ucln:=n;End;(*------------------------------------Tinh theo cong thuc moi -------------------------------------*)Function f(n, m: word): word;Beginf :=n+m-ucln(m,n);End;Procedure Test;var n, m:word;Beginclrscr;for n:=1 to50 dofor m :=1to 50 dobeginwrite(m,'',n,' ');ifcat(m,n) <> f(m,n) thenbeginwriteln('saí); readln;endelsewriteln('Dung');end;End;BEGINTest;END.Lời bình: Nếu phương ánmới này tốt hơn phương án cũ thì tại sao người ta lại hay sử dụng thuật toánBresnham? Câu trả lời khá đơn giản: vì thuật toán Bresnham giải trình được cácbước tính còn thuật toán cải tiến nói trên, tức là hàm f chỉ cho kết quả cuốicùng. Bạn thử thêm yêu cầu "hãy liệtkê các ô bị cắt" thì sẽ thấy ngay sự tiện lợi của thuật toán Bresnham.Trong đồ họa máy tính khi phải vẽ các đường thẳng người ta phải xác định từngđiểm nằm trên đường thẳng. Nếu coi mỗi điểm ứng với một ô vuông đơn vị thì việcxác định các ô bị cắt sẽ chính là việc xác định các điểm nằm trên đường thẳngcần vẽ. Trong một số tớichúng ta sẽ bàn luận về lời giải cho bài toán sau đây:Bài toán 2 . (Xanh, đỏ, tím,vàng) Cho 4 thùng, mỗi thùng đựng các đoạn thẳng thuộc mộttrong 4 màu là xanh, đỏ, tím và vàng. Các đoạn thẳng cùng màu thì dài bằngnhau. Biết chiều dài của mỗi loại đoạn thẳng là lx, ld, lt và lv theo trật tựlần lượt của các màu xanh, đỏ, tím và vàng. Cần chọn ra không quá n đoạn thẳngđể xếp thành cạnh của một hình chữ nhật có màu lần lượt là cạnh xanh, cạnh đỏ,cạnh tím và cạnh vàng sao cho diện tích của hình là lớn nhất.Dữ liệu vào: Tệp văn bản XDTV.INP gồm 5 số tự nhiêncách nhau bởi dấu cách: n lx ld lt lv.Dữ liệu ra: Tệp văn bản chứa 6 số tự nhiên cách nhaubởi dấu cách: m dx đ dt dv s biểu thị các giá trị sau:m: tổng số đoạn thẳng cần chọndx: số đoạn thẳng màu xanhđ: số đoạn thẳng màu đỏ dt: số đoạn thẳng màu tímdv: số đoạn thẳng màu vàngs: diện tích max tìm được.Trường hợp vô nghiệm: chỉ ghi 1 số 0.Thí dụ:XDTV.INP35 3 2 2 5XDTV.OUT34 8 10 12 4 480Nguyễn Xuân Huy . Hãy đặt bút trước khi đặt tay vào bàn phímNguyễn Xuân HuyBài toán 1 . (Cắt bánh,phỏng theo bài. thử thêm yêu cầu " ;hãy liệtkê các ô bị cắt" thì sẽ thấy ngay sự tiện lợi của thuật toán Bresnham.Trong đồ họa máy tính khi phải vẽ các đường thẳng

Ngày đăng: 10/09/2012, 15:27

Hình ảnh liên quan

Gọi f(m,n) làcông thức tính số ô bị cắttrong hình chữ nhật kíchthước xm đơn vị. Đầu tiên ta nhận thấy rằngcông thức này phải đối xứng, tức là f(m,n) = f(n,m) - Hãy đặt bút trước khi đặt tay vào bàn phím

i.

f(m,n) làcông thức tính số ô bị cắttrong hình chữ nhật kíchthước xm đơn vị. Đầu tiên ta nhận thấy rằngcông thức này phải đối xứng, tức là f(m,n) = f(n,m) Xem tại trang 1 của tài liệu.

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan