Tải bản đầy đủ (.pdf) (25 trang)

SKKN Ứng dụng lý thuyết toán để giải các bài toán tin Phần 3 Hình học tính toán

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (356.73 KB, 25 trang )

M ỤC L ỤC
NỘI DUNG

TRANG

MỤC LỤC

1

I. PHẦN ĐẶT VẤN ĐỀ

2

I.1/ Lý do chọn đề tài

2

I.2/ Mục tiêu nghiên cứu

2

I.3/ Nhiệm vụ nghiên cứu

2

I.4/ Đối tượng nghiên cứu

2

I.5/ Các phương pháp nghiên cứu


2

II. PHẦN NỘI DUNG

4

II.1/ Lịch sử của vấn đề nghiên cứu

4

II.2/ Cơ sở lý luận của đề tài

4

II.3/ Thực trạng của vấn đề nghiên cứu

4

II.4/ Nội dung nghiên cứu và kết quả nghiên cứu

4

A/ NỘI DUNG NGHIÊN CỨU

4

A.1) Lý thuyết cơ bản về hình học tính toán.

4


A.2) Các bài tập áp dụng.

14

A.3) Một số bài tập đề nghị.

19

A.4) Kết luận.

23

B/ KẾT QUẢ NGHIÊN CỨU

24

III. PHẦN KẾT LUẬN

24

III.1/ Kết luận

24

III.2/ Tài liệu tham khảo

25

1



I. PHẦN ĐẶT VẤN ĐỀ
I.1/ Lý do chọn đề tài
Để tiếp tục hoàn chỉnh chuyên đề bồi dưỡng HSG chuyên Tin “ỨNG DỤNG
LÝ THUYẾT TOÁN ĐỂ GIẢI CÁC BÀI TOÁN TIN”; qua quá trình nghiên cứu,
giảng dạy, tham khảo ý kiến đồng nghiệp, tôi thấy rằng hàng năm các đề thi tin học
trong khu vực cũng như Quốc gia có một số các bài toán trong lập trình tin học đề
cập nhiều đến các yếu tố hình học, cụ thể là hình học tính toán. Chính vì vậy tôi tiếp
tục chọn viết tiếp đề tài về chuyên đề “ỨNG DỤNG LÝ THUYẾT TOÁN ĐỂ GIẢI
CÁC BÀI TOÁN TIN” (Phần 3: Hình học tính toán).
I.2/ Mục tiêu nghiên cứu
Như đã biết, toán học có ảnh hưởng rất lớn đến mọi lĩnh vực của cuộc sống.
Các bài toán tin nếu có được thuật toán dựa trên cơ sở lý thuyết toán học vững chắc
sẽ đem lại kết quả tốt hơn rất nhiều so với các thuật toán khác. Giúp các em học sinh
có kiến thức tốt, tư duy tốt về lập trình; hình học tính toán là một trong những vấn đề
về kỹ thuật lập trình có ứng dụng tư duy toán học, cụ thể là hình học mà bất cứ
người lập trình tin học đều cần phải biết xử lý.
I.3/ Nhiệm vụ nghiên cứu
Trước hết là thực hiện đổi mới phương pháp giảng dạy Tin học làm cho học
sinh sáng tạo tìm những kết quả, lời giải hay trên một “dạng bài toán tin có sử dụng
toán học”; giúp bản thân nắm vững hơn nữa về lập trình, tư duy thuật toán, kỹ thuật
lập trình về hình học tính toán, đồng thời trao đổi và học tập kinh nghiệm ở Quý
Thầy Cô ở Tổ Tin học.
I.4/ Đối tượng nghiên cứu
Trong nghiên cứu này, các học sinh được chọn là các em học lớp chuyên Tin
học khối 10, 11, 12 và những học sinh bồi dưỡng chuẩn bị thi HSG cấp Tỉnh, cấp
Quốc gia thuộc một trường THPT Chuyên Tiền Giang và một số giáo viên đứng lớp
dạy tin học ở trường THPT đó.
I.5/ Các phương pháp nghiên cứu


2


* Phương pháp suy luận, tổng hợp: kết hợp từ nhiều nguồn tài liệu tham khảo
của các tác giả và tra cứu trên mạng internet với các đề thi Học sinh Giỏi rút ra
những kinh nghiệm, hệ thống lại kiến thức, mở ra các hướng mới.
* Phương pháp trò chuyện – phỏng vấn: trao đổi tâm tình với nhiều học sinh
giỏi để nắm tình hình trong việc giải các bài toán tin về hình học.
* Phương pháp khảo sát: bản thân được tham gia giảng dạy các lớp chuyên
tin, đội tuyển HSG, các kỳ tập huấn, ra đề; tham khảo đồng nghiệp, quý Thầy Cô đã
giảng dạy đội tuyển nhiều năm nên có nắm được tình hình sử dụng các phương pháp
làm bài của các em học sinh.
* Phương pháp phân tích lý luận: phân tích giúp học sinh nắm thật rõ bản chất
vấn đề, lựa chọn được phương pháp giải cho phù hợp.

3


II. PHẦN NỘI DUNG
II.1/ Lịch sử của vấn đề nghiên cứu
Trong những năm liên tiếp dạy học sinh các lớp chuyên tin, bồi dưỡng HSG
lớp 10, 11, 12 và đội tuyển thi HSG cấp Tỉnh, cấp Quốc Gia môn Tin học và bản
thân tôi được tham dự lớp “BỒI DƯỠNG TẬP HUẤN GIẢNG DẠY CHUYÊN ĐỀ
MÔN CHUYÊN TIN HỌC THPT” nhiều năm do Bộ GD&ĐT tổ chức. Tôi nhận
thấy kiến thức về Tin học của mình được nâng lên rõ rệt. Các bài giảng của các Thầy
NGUYỄN THANH TÙNG, Thầy ĐỖ ĐỨC ĐÔNG, Thầy LÊ MINH HOÀNG, cũng
như tham khảo ý kiến các đồng nghiệp chuyên dạy bồi dưỡng đội tuyển ở các Tỉnh
bạn, ở các trường THPT Chuyên, tôi rút ra một điều là “KIẾN THỨC TOÁN HỌC
RẤT QUAN TRỌNG DẠY LẬP TRÌNH TRONG TIN HỌC”. Được sự động viên
khuyến khích của quý Thầy Cô trong tổ, cũng như thầy LÊ NGỌC LINH, tôi mạnh

dạng tiếp tục chọn viết phần ba cho đề tài này là “Hình học tính toán”;
II.2/ Cơ sở lý luận của đề tài
Kết hợp bài giảng và các tài liệu tham khảo, kiến thức của bản thân để phân
tích, tổng hợp, hệ thống.
II.3/ Thực trạng của vấn đề nghiên cứu
Đa số học sinh chuyên tin rất ngại, sợ khi giải các bài toán tin về hình học
trong toán; rất lúng túng trong quá trình phân tích, tổ chức dữ liệu, thuật toán, kỹ
thuật lập trình để tìm ra bản chất và vận dụng kiến thức một cách thích hợp.
II.4/ Nội dung nghiên cứu và kết quả nghiên cứu
A/ NỘI DUNG NGHIÊN CỨU
A.1) Lý thuyết cơ bản về hình học tính toán
A.1.1) Kiến thức cơ bản của hình học
A.1.1.1) Tọa độ
a). Trục toạ độ
 Trục toạ độ (trục) là một đường thẳng trên đó đã xác định một điểm gốc O và


một vectơ đơn vị e . Kí hiệu O; e  .



 Toạ độ của vectơ trên trục:
u  (a)  u  a.e .
4







To ca im trờn trc: M (k ) OM k .e .


di i s ca
vect
trờn
trc:
AB a AB a.e .


Chỳ ý: + Nu AB cuứng hửụựng vụựi e thỡ AB AB .


Nu AB ngửụùc hửụựng vụựi e thỡ AB AB .
+ Nu A(a), B(b) thỡ AB b a .
+ H thc Sal: Vi A, B, C tu ý trờn trc, ta cú: AB BC AC .
b). H trc to
H gm hai
trc to Ox, Oy vuụng gúc vi nhau. Vect n v trờn Ox, Oy

ln lt l i , j . O l gc to , Ox l trc honh, Oy l trc tung.




To ca vect i vi h trc to :
u ( x; y ) u x .i y. j .




To ca im i vi h trc to :
M ( x; y ) OM x .i y. j .


Tớnh cht: Cho a ( x; y), b ( x; y ), k R , A( x A ; y A ), B( xB ; yB ), C ( xC ; yC ) :









y y

+ a b x x






+ b cựng phng vi a 0





+ a b ( x x ; y y )




+ ka (kx; ky )

k R: x kx vaứ y ky .
x y

(nu x
x
y

0, y 0).

+ AB ( xB x A ; yB y A ) .
x A xB
y y
; yI A B .
2
2
x x x
y y y
+ To trng tõm G ca tam giỏc ABC: xG A B C ; yG A B C .
3
3
x kxB
y kyB
+ To im M chia on AB theo t s k 1: xM A
; yM A
.

1

k
1

k


( M chia on AB theo t s k MA k MB ).

+ To trung im I ca on thng AB: xI

A.1.1.2) Tớch vụ hng (tớch chm)
a). Gúc gia hai vect


Cho a, b 0 . T mt im O bt kỡ v OA a , OB b .

0
AOB vi 00
Khi ú a, b
AOB 180 .
Chỳ ý:


+ a, b = 900 a b


+ a, b = 00 a , b cựng hng



+ a, b = 1800 a , b ngc hng


+ a, b b , a
5


a


b

A
a

O

b

B


b). Tích vô hướng của hai vectơ
  
 
 Định nghĩa: a.b  a . b .cos  a, b  .





2

Đặc biệt:
a.a  a 2  a .
  
 Tính chất: Với a, b , c bất kì và kR, ta có:
 
  
 
+ a.b  b .a ;
a  b  c   a.b  a.c ;





 
 ka  .b  k  a.b   a.  kb  ;
a 2  0; a 2  0  a  0 .













2



 a  b 2  a 2  2 a.b  b 2 ;
+  a  b   a 2  2 a.b  b 2 ;


   
a 2  b 2   a  b  a  b  .

 

 
+ a.b > 0   a, b  nhọn
+ a.b < 0   a, b  tù

 
a.b = 0   a, b  vuông.
c). Biểu thức toạ độ của tích vô hướng



 Cho a = (a1, a2), b = (b1, b2). Khi đó: a.b  a1b1  a2 b2 .

 
cos(a , b ) 




 a  a12  a22 ;

a1b1  a2 b2
a12  a22 . b12  b22

;

 
a  b  a1b1  a2 b2  0

 Cho A( x A ; y A ), B( xB ; yB ) . Khi đó: AB  ( xB  x A )2  ( yB  y A )2 .
A.1.1.3) Tích hữu hướng (tích chéo)




 

Tích chéo của hai vectơ u và v , kí hiệu u  v là một số thực được tính bằng




tích độ dài hai vectơ u và v nhân với sin của góc xen giữa hai vectơ đó. Góc xen
giữa hai vecto này là góc định hướng, có số đo từ  tới  , số đo mang dấu dương





nếu chiều quay từ u tới v là chiều thuận (ngược chiều kim đồng hồ) và mang dấu




âm nếu chiều quay từ u tới v là chiều nghịch (theo chiều kim đồng hồ)


6
6
Bằng công cụ đại số tuyến tính, người ta chứng minh được công thức của tích


chéo giữa hai vecto u   xu , yu  và v   xv , yv  như sau:


 
x x
u  v  xu yv  xv yu  u v
yu yv

6


 xu xv 
 . Từ đó ta suy ra
y
y
 u v



công thức tính sin của góc định hướng  giữa hai vecto u   xu , yu  và v   xv , yv  :
 
uv
xu yv  xv yu
sin     
u .v
( xu2  y2u )(x 2v +y2v

tức là giá trị của tích chéo bằng định thức của ma trận 

 

Về mặt hình học, giá trị tuyệt đối của tích chéo u  v là diện tích hình bình


 





 

hành OABC, trong đó O là gốc tọa độ, OA  u , OC  v và OB  u  v

Tích chéo có một ứng dụng quan trọng trong việc khảo sát chiều: Giả sử ta đi
từ điểm A sang điểm B theo đường thẳng và đi tiếp sang điểm C theo đường thẳng,
khi đó:

 

- Tích chéo AB  BC sẽ là số dương nếu chỗ rẽ tại B là “rẽ trái” (hay nói đúng
hơn là bẻ góc ngược chiều kim đồng hồ);
 

- Tích chéo AB  BC là số âm nếu chỗ rẽ B là “rẽ phải”;
 

- Tích chéo AB  BC = 0 có nghĩa là ba điểm A, B, C thẳng hàng.
A

C

A

CCW

B
CW

B
C

A.1.1.4) Đường thẳng
a). Vectơ chỉ phương của đường thẳng

Vectơ u  0 đgl vectơ chỉ phương của đường thẳng  nếu giá của nó song song
hoặc trùng với .



Nhận xét:– Nếu u là một VTCP của  thì ku (k  0) cũng là một VTCP của .
– Một đường thẳng hoàn toàn được xác định nếu biết một điểm và một
VTCP.
b). Vectơ pháp tuyến của đường thẳng

Vectơ n  0 đgl vectơ pháp tuyến của đường thẳng  nếu giá của nó vuông góc
với .


Nhận xét: – Nếu n là một VTPT của  thì kn (k  0) cũng là một VTPT của .
– Một đường thẳng hoàn toàn được xác định nếu biết một điểm và một
7


VTPT.









– Nếu u là một VTCP và n là một VTPT của  thì u  n .
c). Phương trình tham số của đường thẳng

Cho đường thẳng  đi qua M0 ( x0 ; y0 ) và có VTCP u  (u1; u2 ) .
Phương trình tham số của :


 x  x 0  tu1

 y  y0  tu2

(1) ( t là tham số).

 x  x  tu

0
1.
Nhận xét: – M(x; y)     t  R: 
y

y

tu

0
2

– Gọi k là hệ số góc của  thì:
+ k = tan, với  = 
xAv ,   90 0 .
+k=

u2
,
u1


với u1  0 .

d). Phương trình chính tắc của đường thẳng

Cho đường thẳng  đi qua M0 ( x0 ; y0 ) và có VTCP u  (u1; u2 ) .
Phương trình chính tắc của :

x  x0 y  y0

u1
u2

(2) (u1  0, u2  0).

Chú ý: Trong trường hợp u1 = 0 hoặc u2 = 0 thì đường thẳng không có phương
trình
chính tắc.
e). Phương trình tổng quát của đường thẳng
PT ax  by  c  0 với a2  b2  0 đgl phương trình tổng quát của đường thẳng.
Nhận xét: – Nếu  có phương trình ax  by  c  0 thì  có:



VTPT là n  (a; b) và VTCP
u  (b; a) hoặc u  (b; a) .

– Nếu  đi qua M0 ( x0 ; y0 ) và có VTPT n  (a; b) thì phương trình của 
là:
a( x  x 0 )  b ( y  y 0 )  0


Các trường hợp đặc biệt:
Các hệ số
c=0
a=0
b=0

Phương trình đường thẳng 
ax  by  0
by  c  0
ax  c  0

8

Tính chất đường thẳng 
 đi qua gốc toạ độ O
 // Ox hoặc   Ox
 // Oy hoặc   Oy


  đi qua hai điểm A(a; 0), B(0; b) (a, b  0): Phương trình của :

x y
  1.
a b

(phương trình đường thẳng theo đoạn chắn) .
  đi qua điểm M0 ( x0 ; y0 ) và có hệ số góc k: Phương trình của :
y  y0  k ( x  x0 )

(phương trình đường thẳng theo hệ số góc)

f). Vị trí tương đối của hai đường thẳng
Cho hai đường thẳng 1: a1 x  b1y  c1  0 và 2: a2 x  b2 y  c2  0 .
Toạ độ giao điểm của 1 và 2 là nghiệm của hệ phương trình:
a1 x  b1y  c1  0

a2 x  b2 y  c2  0

(1)

 1 cắt 2  hệ (1) có một nghiệm 

a1 b1

a2 b2

 1 // 2

a1 b1 c1
(nếu a2 , b2 , c2  0 )


a2 b2 c2

 hệ (1) vô nghiệm



 1  2  hệ (1) có vô số nghiệm 

(nếu a2 , b2 , c2  0 )


a1 b1 c1
(nếu a2 , b2 , c2  0 )


a2 b2 c2

g). Góc giữa hai đường thẳng

Cho hai đường thẳng 1: a1 x  b1y  c1  0 (có VTPT n1  (a1; b1 ) )


và 2: a2 x  b2 y  c2  0 (có VTPT n2  (a2 ; b2 ) ).

 
(n , n )
khi (n1 , n2 )  900
(
1 , 2 )   1 0 2  
 
0
180  ( n1 , n2 ) khi ( n1 , n2 )  90
 
n1.n2
a1b1  a2 b2
 


cos(1 , 2 )  cos( n1 , n2 )    
n1 . n2

a12  b12 . a22  b22

Chú ý:  1  2  a1a2  b1b2  0 .

 Cho 1: y  k1 x  m1 , 2: y  k2 x  m2 thì:
+ 1 // 2  k1 = k2
+ 1  2  k1. k2 = –1.
h). Khoảng cách từ một điểm đến một đường thẳng
 Khoảng cách từ một điểm đến một đường thẳng
Cho đường thẳng : ax  by  c  0 và điểm M0 ( x0 ; y0 ) .
d ( M0 , ) 

ax0  by0  c
a2  b2

 Vị trí tương đối của hai điểm đối với một đường thẳng
Cho đường thẳng : ax  by  c  0 và hai điểm M ( xM ; yM ), N ( x N ; y N )  .
9


– M, N nằm cùng phía đối với   (axM  by M  c )(ax N  by N  c )  0 .
– M, N nằm khác phía đối với   (axM  by M  c )(ax N  by N  c )  0 .
 Phương trình các đường phân giác của các góc tạo bởi hai đường thẳng
Cho hai đường thẳng 1: a1 x  b1y  c1  0 và 2: a2 x  b2 y  c2  0 cắt nhau.
Phương trình các đường phân giác của các góc tạo bởi hai đường thẳng 1 và
2 là:
a1 x  b1y  c1
a12  b12




a2 x  b2 y  c2
a22  b22

A.1.1.5) Đa giác
Đa giác là một đường gấp khúc khép kín. Trong lập trình, một đa giác được
lưu bởi một dãy các đỉnh liên tiếp nhau A1, A2, …,An
Diện tích đại số của một đa giác không tự cắt có thể được xác định bởi công
thức: S 

( x1  x2 )( y1 +y 2 )+(x 2 -x 3 )(y2 +y 3 )+...+(x n -x1 )(y n +y1 )
2

S chính là diện tích của đa giác.

Đặc biệt, diện tích tam giác
1
1
1
aha  bhb  chc
2
2
2
1
1
1
= bc sin A  ca sin B  ab sin C
2
2
2

abc
=
4R
= pr

S=

=

p( p  a)( p  b)( p  c)

 
AB  AC
=
2

=

(công thức Hê–rông)

( xB  x A )( yC  y A )  ( xC  x A )( yB  y A )
2

A.1.1.6) Đường tròn
Đường tròn (O; R) là tập hợp các điểm cách đều tâm O(x; y) một khoảng cách
R. Đường tròn được hoàn toàn xác định bởi bộ ba số (x; y; R) với R > 0.
10


A.1.2) Các giải thuật về hình học trong tin học

A.1.2.1) Khai báo kiểu các đối tượng trong Pascal
Type
TPoint = Record
x, y: Float;
End;
TVector = Tpoint;
A.1.2.2) Biểu diễn tuyến tính
 









Cho 3 vecto a , b và c . Hãy tìm 2 số thực p, q để c  pa  qb .
Hai số p, q có thể tính bằng công thức
 
c  b Dx
p   
ab D
 
a  c Dy
q   
ab D
 

 Nếu D  a  b  0 thì có duy nhất một cách biểu diễn tuyến tính vecto c qua



hai vecto a và b (nghiệm p, q là duy nhất)


 Nếu D = 0, hai vecto a và b song song với nhau, khi đó:



+ (p; q) = (Nan; Nan) nếu c song song với cả a và b



+ (p; q) = (Inf; Inf) nếu c không song song với a và b

Ta viết hàm: function SolveSLE (Const a, b, c: TVector) : TVector;
  

nhận vào ba vecto a , b , c và trả về một vecto có tọa độ (x; y) tương ứng với hệ số
(p; q) cần tìm.
Function SolveSLE (const a, b, c: Tvector) : Tvector;
Var
D: Float;
Begin
D := a >< b;
Result := Vector((c >< b)/D, (a >< c)/D);
End;
11



A.1.2.3) Tìm giao điểm hai đường thẳng
Trên mặt phẳng với hệ tọa độ Đề-các vuông góc cho hai đường thẳng với
phương trình tổng quát:
A1x + B1y + C1 = 0;

A2x + B2y + C2 = 0;

Bài toán đặt ra là xác định giao điểm hai đường thẳng đã cho.






Đặt u  (A1;A 2 ), v  ( B1 ; B2 ), w  (C1 ; C2 ) , bài toán trở thành bài toán biểu






diễn vector w qua tổ hợp tuyến tính của hai vector u và v



w  x.u  y.v

Việc còn lại chỉ là biện luận cho giá trị giao điểm tìm được, lúc đó ta sẽ viết
thêm hàm vector và toán tử tích chéo sau:
Hàm vector

Function Vector (x, y : Float) : Tvector;
Begin
Result.x := x;
Result.y := y;
End;
Tích chéo của hai vector
Operator >< (const u, v : Tvector) : Float;
Begin
Result := u.x * v.y – u.y * v.x;
End;
A.1.2.4) Tìm giao điểm hai đoạn thẳng
Tương tự, ta có thể tìm giao điểm của hai đoạn thẳng AB và CD:
- Viết phương trình tổng quát của hai đường thẳng AB và CD;
- Tìm giao điểm M của hai đường thẳng;
- Kiểm tra M có nằm trên đoạn thẳng AB và trên đoạn thẳng CD hay không.
Phương trình đường thẳng đi qua hai điểm phân biệt A(xA; yA); B(xB; yB) là
(x – xA) * (yB – yA) = (y – yA) * (xB – xA)
12


A.1.2.5) Tìm giao điểm giữa một đoạn thẳng và một tia
Tương tự, để tìm giao điểm duy nhất giữa đoạn thẳng AB và tia CD, ta có thể
sử dụng phương pháp tương tự như trên: Nếu M là giao điểm duy nhất của đoạn
thẳng AB và tia CD thì sẽ tồn tại duy nhất một cặp số thực p, q, trong đó
p  [0;1], q  [0; ) sao cho


 AM  p AB

 

CM  qCD

Áp dụng thuật toán như trên, chỉ có điều sau khi tìm được cặp số p, q, ta
không kiểm tra p, q  [0;1] mà kiểm tra p  [0;1] và q > 0.
A.1.2.6) Tìm diện tích đa giác
Bài toán: Tính diện tích đa giác (lồi hoặc lõm và không tự cắt) gồm n đỉnh
A[1], A[2], …, A[n] (n>2).
Thuật toán: Ta có thể giải bài toán này bằng cách chia đa giác thành n − 2 tam
giác rồi tính tổng diện tích của các tam giác ấy. Tuy nhiên phương pháp này phức
tạp, ta làm cách khác như sau: chia đa giác thành các hình thang bằng cách chiếu các
cạnh xuống trục hoành (hoặc trục tung). Hình thang được xác định bởi cạnh
A[i]A[i+1] có diện tích là Abs(S) với:
S = (A[i].x - A [i+1].x).(A[i].y + A[i+1].y) /2;
sau khi gán đỉnh A[n+1] = A[1], ta tính diện tích toàn phần của đa giác như sau:
Procedure dientich;
Begin
S: = 0;
For i: =1 to n do
S := S + (A[i].x - A [i+1].x).(A[i].y + A[i+1].y);
S: = (1/2) * Abs(S);
End;

13


A.2) Một số bài tập áp dụng
I. Dạng mối quan hệ giữa các yếu tố hình học
Bài 1. Kiểm tra tính lồi lõm của một đa giác.
Trong mặt phẳng toạ độ có n điểm có toạ độ tương ứng là (x1, y1), (x2, y2)
,…, (xn, yn). Biết rằng n điểm đã cho theo thứ tự tạo thành các đỉnh của một đa giác

không tự cắt.
Yêu cầu: hãy kiểm tra đa giác lồi hay lõm.
Dữ liệu vào: ghi trong file dagiac.inp dòng đầu ghi một số n (n>2), n dòng tiếp
theo, trên dòng thứ i ghi hai số thực theo thứ tự là hoành độ và tung độ của đỉnh thứ
i-1 của đa giác.
Dữ liệu ra: ghi vào file dagiac.out gồm một số 0 hoặc 1, ghi 0 nếu đa giác lõm
và ghi 1 nếu đa giác lồi.
Thuật toán: Gọi diện tích của đa giác là S0. Ta sẽ so sánh S0 với các Si,
trong đó Si là diện tích của đa giác thu được từ đa giác ban đầu sau khi bỏ đi đỉnh
thứ i (i=1, 2,…, n). Nếu $ i sao cho Si > S0 thì đa giác đã cho lõm (tại đỉnh thứ i),
ngược lại thì đa giác đã cho lồi.
Chương trình:
type

read(f,a[i].x);
read(f,a[i].y);
end;
close(f);
a[n+1]:=a[1];
{Tinh dien tich da giac}
s0:=0;
for i:=1 to n do
s0:=s0+(a[i+1].xa[i].x)*(a[i+1].y+a[i].y);
s0:=abs(s0)/2

diem=record
x,y:real;
end;
var a:array [1..100] of diem;
n,vt:integer;

s0,s1:real;
procedure init;
var f:text;i:byte;
begin
assign(f,’dagiac.inp’);
reset(f);
readln(f,n);
{while not eof(f) do}
For i:= 1 to n do
begin

end;
Procedure Inkq(i:byte);
var f:text;
begin
assign(f,’dagiac.out’);
14


rewrite(f);
write(f,i);
close(f);

s1:=s1+(b[j+1].xb[j].x)*(b[j+1].y+b[j].y);
s1:=abs(s1)/2;
if s1>s0 then
begin
inkq(0);
halt
end;

end;
inkq(1);
End;
begin
init;
resolve;
end.

end;
Procedure resolve;
var b: array [1..50] of diem;
i,j,k:byte;
Begin
for i:=1 to n do
begin
for j:=1 to i-1 do b[j]:=a[j];
for j:=i+1 to n+1 do b[j-1]:=a[j];
s1:=0;
for j:=1 to n-1 do

Bài 2. Chia đa giác (đề thi HS giỏi quốc gia lớp 12, bảng B, năm 1999- 2000).
Trong mặt phẳng toạ độ có n điểm có toạ độ tương ứng là (x1, y1), (x2,
y2),…,(xn, yn). Biết rằng n điểm đã cho theo thứ tự tạo thành các đỉnh của một đa
giác không tự cắt.
Yêu cầu: hãy chia đa giác đã cho thành hai đa giác bởi một cạnh nối hai đỉnh
không kề nhau sao cho diện tích của chúng chênh lệch nhau ít nhất.
Dữ liệu vào: ghi trong file dagiac.inp: dòng đầu ghi một số n (n>3), n dòng
tiếp theo, trên dòng thứ i ghi hai số thực theo thứ tự là hoành độ và tung độ của đỉnh
thứ i-1của đa giác.
Dữ liệu ra: ghi vào file dagiac.out gồm hai số nguyên dương chỉ số thứ tự của

hai đỉnh được nối sao cho thoả mãn điều kiện đầu bài.
Thuật toán: Ta đưa ra thuật toán rất đơn giản như sau: thử tìm mọi cách chia
và ghi nhận lại cách chia tốt nhất. Dễ thấy độ phức tạp của thuật toán trong trường
hợp này là O(n3).
Chương trình:
type
diem = record

x,y:real;
end;
15


var

a:array [1..100] of diem;
n,vt1,vt2:integer;
s0,s1,del:real;
procedure init;
var f:text;i:byte;
begin
assign(f,’dagiac.inp’);
reset(f);
readln(f,n);
for i:= 1 to n do
begin
read(f,a[i].x);
read(f,a[i].y);
end;
close(f);

a[n+1]:=a[1];
s0:=0;
for i:=1 to n do
s0:=s0+(a[i+1].xa[i].x)*(a[i+1].y+a[i].y);
s0:=abs(s0)/2;
del:=s0;
end;
Procedure resolve;
var b:array [1..50] of diem;
i,j,k,h:byte;
f:text;
Begin
for i:=1 to n-2 do
begin
for h:=i+2 to n-1 do

begin
k:=0;
for j:= i to h do
begin
inc(k);
b[k]:=a[j];
end;
b[k+1]:=b[1];
s1:=0;
for j:=1 to k do
s1:=s1+(b[j+1].xb[j].x)*(b[j+1].y+b[j].y);
s1:=abs(s1)/2;
if del>abs(2*s1-s0) then
begin

vt1:=i;
vt2:=j;
del:=abs(2*s1-s0);
end;
end;
end;
assign(f,’dagiac.out’);
rewrite(f);
write(f,vt1,’ ’,vt2);
close(f);
End;
begin
init;
resolve;
end.

Bài 3. Cho một đa giác và một điểm. Hãy cho biết điểm đã cho có thuộc đa
giác hay không (điểm đó thuộc cạnh đa giác cũng coi như là thuộc đa giác)
Dữ liệu vào: n (số đỉnh của đa giác)
x1, y1

xi, yi (là tọa độ lần lượt từng đỉnh đa giác theo chiều kim đồng hồ).
2


xn yn
x0, y0: tọa độ điểm cần xét.
Dữ liệu ra: 'Thuộc đa giác' hoặc 'Không thuộc đa giác'
Thuật toán:
- Qua điểm A cần xác định, dựng tia Ax’ sao cho Ax’//Ox.

- Xác định số giao điểm tia Ax’ với cạnh đa giác.
- Xét số giao điểm
+ lẻ: điểm A thuộc đa giác
+ chẵn: điểm A không thuộc đa giác.
 Đặc biệt hóa bài 3.
a. Chúng ta xét trường hợp đặc biệt của bài 3. Ta sẽ thay 'đa giác' bằng tam
giác.
Khi xét 1 tam giác, chúng ta sẽ nảy ra một 'ý tưởng' khác từ nhận xét sau:
Xét 1 điểm M thuộc ABC thì: SABC = SMAB + SMBC + S MAC
Còn nếu M không thuộc ABC thì: SABC < SMAB + SMBC + S MAC
Như vậy, với tam giác, ta có giải thuật sau:
- Tính SABC {có thể dùng công thức Herong hay bằng công thức:
 
AB  AC
S=
}
2

b. Cho tứ diện. Hãy cho biết tâm hình cầu ngoại tiếp tứ diện nằm trong hay
ngoài tứ diện.
II. Dạng lớp bài toán về diện tích
1. Tính diện tích đa giác cho trước. Đây là bài toán quen thuộc, cần nhớ để
vận dụng các bài toán khác.
2. Bài toán về diện tích phủ: Cho một số hình chữ nhật, hãy tính diện tích mà
các hình chữ nhật trên phủ. VD: - Tính SMAB + SMBC + S MAC =S’
2


- Xét:
+ SABC = S’ → M thuộc ABC

+ SABC ≠ S’ → M không thuộc ABC.
3. Tổng quát hóa bài toán 2: Bây giờ, chúng ta thử tổng quát bài toán 2 từ 'tam
giác' lên 'tứ diện' xem sao: {Các tọa độ điểm bây giờ có dạng (x,y,z)}
Chúng ta cũng xuất phát từ nhận xét:
- M thuộc ABCD thì VABCD = VMABC + VMBCD +VMCDA + VMDAB
- M không thuộc ABCD thì VABCD < VMABC + VMBCD +VMCDA + VMDAB Chúng
ta hoàn toàn có thể tính được dễ dàng thể tích 1 tứ diện bằng công thức:

Chính vì thế, giải thuật trở nên đơn giản hơn:
- Tính V’ = VMABC + VMBCD +VMCDA + VMDAB
- Xét: + Nếu V’=V suy ra M thuộc tứ diện.
+ Nếu V’ ≠ V suy ra M không thuộc tứ diện.
4. Qua những bài toán trên, bạn hãy tham khảo 2 bài toán tổng hợp sau:
a. Cho 1 đa giác trên mặt phẳng. Đa giác có thể lõm. Hãy cho biết số giao
điểm của nó với 1 đa giác khác (đa giác này lồi)
VD:

b. Cho tứ diện. Hãy cho biết tâm hình cầu ngoại tiếp tứ diện nằm trong hay
ngoài tứ diện.

3


A.3) Một số bài tập đề nghị
Bài 1: Diện tích phủ bởi các tam giác
Trên mặt phẳng cho N tam giác được xác định bởi toạ độ của ba đỉnh (x1i, y1i),
(x2i, y2i), (x3i, y3i) (i=1,2...,N). Tất cả các toạ độ đều là số nguyên. Cần tìm diện tích
của phần mặt phẳng bị phủ bởi các tam giác này. Giả thiết là tất cả các tam giác
không suy biến (nghĩa là 3 đỉnh của tam giác là ba điểm phân biệt và không nằm trên
cùng một đường thẳng)

Input: File văn bản TAMGIAC.INP
 Dòng đầu tiên ghi số nguyên dương N (N≤10)
 Dòng thứ i trong N dòng tiếp theo chứa 6 số nguyên x1i, y1i, x2i, y2i, x3i, y3i xác
định tam giác thứ i (i=1,2,...,N). Các số nguyên có giá trị tuyệt đối không vượt
quá 1000.
Output: Ghi ra file TAMGIAC.OUT duy nhất một số là giá trị của diện tích cần tìm
với 2 chữ số phần thập phân
Ví dụ:
TAMGIAC.INP

TAMGIAC.OUT

2

2.00

002012
002011
Bài 2: Đa giác
Cho N đa giác lồi thoả mãn các tính chất sau:
- Với 2 đa giác bất kỳ luôn có một đa giác mà mọi điểm của nó nằm trong đa
giác kia
- Các cạnh của chúng không có điểm chung
Bài toán đặt ra là: Với mỗi đa giác i, có bao nhiêu đa giác trong N đa giác nói
trên bao nó (i nằm trong bao nhiêu đa giác)?.
Dữ liệu vào: Vào từ file văn bản DAGIAC.INP
- Dòng đầu tiên ghi số tự nhiên N (3N10000)

4



- Dòng thứ i+1 ghi thông tin về đa giác thứ i, bao gồm: Số đầu tiên Si là số
đỉnh của đa giác; Si cặp số nguyên tiếp theo lần lượt là hoành độ và tung độ các đỉnh
của đa giác. Các số trên cùng dòng cách nhau ít nhất một dấu cách.
Dữ liệu ra: Ghi ra file văn bản DAGIAC.OUT gồm N dòng, dòng thứ i ghi số
lượng các đa giác bao đa giác i.
Ví dụ:
DAGIAC.INP

DAGIAC.OUT

4

0

4 1 1 15 1 15 8 1 8

2

493964643

1

4 3 2 11 2 11 7 3 7

3

3848568
Bài 3: Chia đất
Một người cha khi mất đi để lại một mảnh đất có hình dạng là một đa giác lồi

làm của thừa kế cho hai người con của mình. Trong di chúc ông yêu cầu rằng hai
người con phải chia mảnh đất này thành hai phần có diện tích bằng nhau theo một
đường ranh giới thảng dọc theo phương Nam - Bắc. Bạn là người được giao giúp hai
người con thực hiện bản di chúc này. Hãy viết chương trình tìm cách chia.
Giả sử mảnh đất là đa giác lồi với các đỉnh là A1A2....An nằm trên mặt phẳng
toạ độ còn trục Oy nằm theo hướng Nam - Bắc, Ox theo hướng Tây - Đông.
Input: Cho trong file CHIADAT.INP
 Dòng đầu tiên ghi N là số đỉnh của đa giác (N≤5000)
 Trong N dòng tiếp theo, dòng thứ i ghi hai số nguyên xi, yi lần lượt là hoành
độ và tung độ của điểm thứ i trong số N đỉnh đa giác (các đỉnh của đa giác được liệt
kê theo chiều xuôi hoặc ngược kim đồng hồ)
Output: Ghi ra file văn bản CHIADAT.OUT một số thực x0 với ý nghĩa đường
ranh giới dùng để chia đất là đường thẳng x=x0 (x0 viết với 4 chữ số phần thập phân)
Ví dụ:
CHIADAT.INP

CHIADAT.OUT

4

1.0000
5


0 0
2 0
2 2
0 2
Bài 4: POLYGON
Đức vua vương quốc XYZ tổ chức kén rể cho cô công chúa duy nhất của

mình. Vì vậy, ông đặt ra những yêu cầu rất cao cho con rể tương lai. Để có thể trở
thành con rể của ngài, các chàng trai thi nhau thể hiện mình. Sau khi vượt qua những
phần thi đòi hỏi sức khoẻ, lòng dũng cảm, … họ sẽ gặp phải một thử thách vô cùng
khó khăn, đó là phần thi về sự nhanh nhạy và thông minh. Đức vua sẽ cho mỗi người
một miếng bìa hình đa giác lồi N đỉnh. Đức vua yêu cầu các chàng trai vẽ N-3 đường
chéo bất kì sao cho 2 đường chéo bất kì không có điểm chung khác các đầu mút. Với
cách vẽ như vậy, chúng ta sẽ thu được N-2 hình tam giác. Đức vua yêu cầu họ hãy
tìm 2 cách chia:
 Một cách chia sao cho tam giác có diện tích lớn nhất trong N-2 tam giác là lớn
nhất.
 Một cách chia sao cho tam giác có diện tích lớn nhất trong N-2 tam giác là
nhỏ nhất.
Sau khi nhà vua đưa ra hình dạng của đa giác lồi, họ sẽ chỉ có 1 giây để đưa ra
đáp án của mình. Người đưa ra đáp án đúng nhất và nhanh nhất sẽ được chọn làm
phò mã. Bạn cũng là một người đã lọt vào vòng thi này. Hãy chứng tỏ khả năng của
mình đi!
Input: POLYGON.INP
 Dòng đầu tiên ghi số nguyên N là số đỉnh của đa giác.
 Trong n dòng sau, mỗi dòng ghi một cặp số nguyên là tọa độ các đỉnh của đa
giác. Các đỉnh được liệt kê theo chiều kim đồng hồ.
Output:

POLYGON.OUT

Trong mỗi trường hợp, bạn cần đưa ra N-3 dòng. Mỗi dòng ghi số hiệu 2 đỉnh
mà bạn nối. N-3 dòng của trường hợp 1 cần được viết trước N-3 dòng của trường
hợp 2.
6



Giới hạn:


4 ≤ N ≤ 200.



Các tọa độ là các số nguyên có trị tuyệt đối không quá 106.



Thời gian: 1s/test.



Bộ nhớ: 1MB

Ví dụ:
POLYGON.INP
5
00
02
14
22
20

Trường hợp 1

POLYGON.OUT
13

35
14
24

Trường hợp 2

Bài 5: CẮT BÁNH
Để ghi tên vào danh sách các kỷ lục Thế giới (Ghiness), David và các bạn làm
một chiếc bánh khổng lồ có hình một đa giác lồi. Sau khi kỷ lục đã được ghi nhận,
Mọi người quyết định cắt bánh chia cho các thành viên tham gia làm bánh theo qui
luật như sau: Mỗi lần chọn 1 đỉnh của đa giác rồi cắt bỏ đỉnh đó bằng cách cắt qua 2
đỉnh kề bên. Phần bánh hình tam giác có được từ mỗi lần cắt như vậy sẽ chia cho các
thí sinh. Công việc cắt bánh sẽ tiếp tục cho đến khi chiếc bánh có dạng một tứ giác.
Miếng bánh cuối cùng này sẽ giành cho người cắt bánh.
David được chọn làm người cắt bánh và lẽ dĩ nhiên, anh ta muốn cắt bánh sao
cho phần của mình có diện tích lớn nhất có thể được..
Yêu cầu: Hãy tính xem phần diện tích lớn nhất của miến bánh hình tứ giác mà
David có thể có được là bao nhiêu.
Dữ liệu: Trong file văn bản CAKE.INP gồm
 Dòng thứ nhất ghi số N là số đỉnh của đa giác.
 N dòng tiếp theo là các cặp số nguyên biểu diễn các đỉnh của đa giác. Các
đỉnh được liệt kê theo chiều kim đồng hồ.
7


Kết quả: Xuất ra file văn bản CAKE.OUT gồm 1 số duy nhất ghi diện tích
lớn nhất của tứ giác tìm được. Kết quả lấy chính xác tới 1 chữ số phần thập phân.
Ví dụ:
CAKE.INP


CAKE.OUT

6

21.0

2 1
2 3
5 7
8 3
8 1
5 0
Giới hạn :


4 ≤ N ≤ 1500



|xi|, |yi| ≤ 15000



Thời gian: 1 giây



Bộ nhớ : 1M

A.4) Kết luận

Tin học và Toán học là hai bộ môn khác biệt nhưng không độc lập với nhau.
Biết vận dụng những kết quả và những suy luận, chứng minh từ toán học sẽ làm cho
những bài toán tin được giải thật đơn giản, và kết quả rất tốt.
Như vậy, Tin học đã sử dụng Toán học rất nhiều. Đặc biệt là những bài toán
về hình học tính toán được phân tích, suy luận dựa vào các định lý, bổ đề trong toán
học mà Tin học đã xây dựng được những thuật toán, giải thuật rất hữu dụng, ngày
nay việc tính toán các bài hình học trong toán không còn là vấn đề khó khăn như
trước đây chưa có sử dụng tin học.

8


B/ KẾT QUẢ NGHIÊN CỨU
Qua quá trình nghiên cứu và vận dụng đề tài chuyên đề “ỨNG DỤNG LÝ
THUYẾT TOÁN ĐỂ GIẢI CÁC BÀI TOÁN TIN” phần 3 – Hình học tính toán, tôi
nhận thấy vấn đề này giúp ích rất nhiều cho học sinh chuyên tin học trong việc học,
giúp các em không còn “ngán ngại” chuyên đề này nữa, các em đã hiểu và vận dụng
khá tốt những phần liên quan đến toán học cũng như tin học (như thuật toán kiểm tra
điểm nằm trong đa giác, diện tích đa giác, giao điềm của các đường thẳng…); một số
em đã bước đầu sáng tạo được những bài toán mới (tuy là những bài toán còn “đơn
giản”). Riêng bản thân tôi sẽ tiếp tục nghiên cứu sâu hơn nữa về chuyên đề này hy
vọng sẽ “làm rõ hơn nữa” để học sinh chuyên tin thích học và đạt nhiều thành tích
hơn nữa.
III. PHẦN KẾT LUẬN
III.1/ Kết luận
Tôi viết đề tài nghiên cứu nhằm mục đích cùng trao đổi với Quý Thầy Cô dạy
chuyên đề bồi dưỡng học sinh giỏi Tin học về việc “hệ thống” các kiến thức, một vài
kỹ năng, ứng dụng toán học vào lập trình giải quyết các bài toán tin. Vì kiến thức và
thời gian còn nhiều hạn chế nên chắc rằng nghiên cứu còn có thiếu sót, tôi chân
thành đón nhận sự góp ý của Quý Thầy Cô. Xin chân thành cảm ơn.


9


III.2/Tài liệu tham khảo
1. Nguyễn Xuân Huy, 2008, tuyển các bài toán tin nâng cao cho học sinh và
sinh viên giỏi “Sáng tạo trong thuật toán và lập trình”, NXB Giáo dục, tập 1, tập 2,
tập 3.
2. Hồ Sĩ Đàm, Đỗ Đức Đông, Lê Minh Hoàng, Nguyễn Thanh Hùng, 2009, “Tài
liệu giáo khoa chuyên tin”, NXB Giáo dục, quyển 1, quyển 2, quyển 3.
3. Donald E. Knuth, The Art of computer programming
4. Kenneth H. Rosen, Toán học rời rạc ứng dụng trong tin học, NXB Giáo dục,
2007, người dịch Phạm Văn Thiều và Đặng Hữu Thịnh.
5. Các đề thi HSG Olympic 30/4.
6. Các đề thi HSG ĐBSCL.
7. Các đề thi HSG Quốc gia.
8. Các đề thi HSG Quốc tế.
9. Một số trang web: o/index.php?...Olympic Tin học Việt Nam.

10


×