Tải bản đầy đủ (.doc) (39 trang)

Tài liệu bồi dưỡng HSG Tin học 9 (Chưa hoàn chỉnh)

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 (548.38 KB, 39 trang )

PHÒNG GIÁO DỤC TÂN THÀNH
TRƯỜNG THCS TÓC TIÊN

Tài liệu
BỒI DƯỠNG HỌC SINH GIỎI
MÔN TIN HỌC (THCS)
(Tài liệu lưu hành nội bộ)
Người biên soạn : Lê Đắc Ước
ĐT : 0907090779 – E-mail :
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 2
Tháng 2 năm 2010
Phần 1 : LÝ THUYẾT
Chương I : MỘT SỐ VẤN ĐỀ TOÁN HỌC
I. HỆ ĐẾM :
1. Hệ đếm thập phân (Decimal): Gồm 10 chữ số biểu diễn (0,1,2,3,4,5, 6,7,8,9)
Dạng tổng quát : a
1
a
2…
a
n
= a
1
.10
n-1
+ a
2
.10
n-2
+… +a
n


.10
0
VD : 357
10
= 3.10
2
+5.10
1
+7.10
0
(Lưu ý : Thường khi viết số ở hệ đếm thập phân người ta không ghi cơ số)
2. Hệ đếm nhị phân (Binary) : Gồm 2 chữ số biểu diễn (0,1)
a)
Dạng tổng quát : a
1
a
2…
a
n
= a
1
.2
n-1
+ a
2
.2
n-2
+ … + a
n
.2

0
VD : 1010
2
= 1.2
3
+ 0.2
2
+ 1.2
1
+ 0.2
0
= 10
(Lưu ý : Đây chính là cách quy đổi từ hệ nhị phân sang hệ thập phân)
b)
Cách quy đổi từ thập phân sang nhị phân :
- Bước 1 : Chia liên tiếp số cần đổi cho 2 đến khi thương bằng 0.
- Bước 2 : Viết ngược lại số dư, ta được số mới trong hệ nhị phân.
VD : Đổi số 6 từ hệ thập phân sang hệ nhị phân, ta làm như sau :
6 2
0
3 2
1
1 2
1
0
Kết quả : 6 = 110
2
3. Hệ đếm thập lục phân (Hexa) :
Gồm 16 chữ số biểu diễn (0,1,2,3,4,5, 6,7,8,9,A,B,C,D,E,F)
a)

Dạng tổng quát :a
1
a
2…
a
n
= a
1
.16
n-1
+ a
2
.16
n-2
+ … + a
n
.16
0
VD : 37D
h
= 3.16
2
+ 7.16
1
+ 13.16
0
= 893
(Lưu ý : Đây chính là cách quy đổi từ hệ Hexa sang hệ thập phân)
b)
Cách quy đổi từ TP sang Hexa :

- Bước 1 : Chia liên tiếp số cần đổi cho 16 đến khi thương bằng 0.
- Bước 2 : Viết ngược lại số dư, ta được số mới trong hệ Hexa.
(Lưu ý : Nếu số dư lớn hơn 9 ta quy đổi thành A, B, C, D, E, F)
 Lê Đắc Ước Tân Thành - ĐT: 0907090779
Giáo dục có rễ đắng mà trái
ngọt.
Aristote (384-322 T.C.N)
Ngừng chia
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 3
c)
Cách quy đổi nhanh từ hệ Hexa sang hệ nhị phân và ngược lại :
Nhận xét : Số lớn nhất trong hệ Hexa có thể đổi ra 4 chữ số trong hệ nhị
phân (1111=F). Do đó muốn đổi từ hệ Hexa ra hệ nhị phân, ta đổi từng con số
Haxa ra nhóm 4 số nhị phân (nếu chưa đủ 4 chữ số nhị phân ta phải thêm các chữ
số 0 vào phía trước). Ngược lại, muốn đổi từ hệ nhị phân sang Hexa, ta nhóm từ
phải sang trái, mỗi nhóm 4 số rồi quy đổi từng nhóm sang hệ Hexa.
II. TẬP HỢP :
1. Phép hợp (Union) : A  B = {x | x ∈ A hoặc x ∈ B}
2. Phép giao (Intersection) : A  B = {x | x ∈ A và x ∈ B}
(Lưu ý : Khi A  B = φ ta nói rằng A và B là hai tập phân biệt)
3. Phép trừ (Difference) : A \ B = {x | x ∈ A và x ∉ B}
4. Phép nhân (Multiplication) : A × B = {(a,b) | a ∈ A và b ∈ B}
5. Phép phân hoạch (Partition) :
Cho X là một tập hợp (X ≠ φ).
Tập X được chia ra thành các tập con A
i
(A
i
≠ φ), họ các tập con A
i

này được
gọi là 1 phân hoạch (hay chia lớp) của tập X khi nó giao nhau từng đôi một bằng
rỗng và hợp lại bằng tập lớn X. Tức là : A  B = φ, ∀ i ≠ j và

i
A
i
= X.
6. Hiệu đối xứng (Symmetric difference) : A ∆ B = (A \ B)  (B \ A)
III. SỐ NGUYÊN TỐ :
- Khái niệm :
Số nguyên tố là số tự nhiên lớn hơn 1, chỉ có 2 ước là 1 và chính nó.
- Định lí :
Mọi hợp số n đều có ít nhất một ước nguyên tố không vuợt quá
n
.
IV. ƯỚC SỐ CHUNG LỚN NHẤT - BỘI SỐ CHUNG NHỎ NHẤT :
- Thuật toán Euclid : Để tìm ƯCLN(a,b), ta có thể làm bằng cách trừ liên tiếp
số lớn cho số nhỏ tới khi 2 số bằng nhau (hoặc chia liên tiếp tới khi số dư bằng
0), giá trị cuối cùng của a hoặc b chính là ƯCLN(a,b).
- Bổ đề : ƯCLN(a,0) = |a|, ∀ a ≠ 0.
-
UCLN(a,b)·BCNN(a, b)=a·b⇔BCNN(a,b)=
b) UCLN(a,
a.b
⇔UCLN(a,b)=
b) BCNN(a,
a.b
V. PHƯƠNG TRÌNH - BẤT PHƯƠNG TRÌNH :
1. Phương trình bậc nhất : ax + b = 0 (1)

Nếu a = 0 thì (1) ⇔ b = 0. Khi đó : b ≠ 0 thì phương trình vô nghiệm;
b = 0 thì PT có vô số nghiệm.
Nếu a ≠ 0 thì phương trình có nghiệm là x = -
a
b
2. Phương trình bậc hai : ax
2
+ bx + c = 0 (a ≠ 0). Ta tính ∆ = b
2
– 4ac
Nếu ∆ < 0 thì phương trình vô nghiệm.
Nếu ∆ = 0 thì phương trình có 1 nghiệm x = -
a
b
2
Nếu ∆ > 0 thì phương trình có 2 nghiệm phân biệt : x
1
=
2
b
a
− + ∆
;x
2
=
2
b
a
− − ∆
3. Bất phương trình bậc nhất : ax + b > 0 (2)

Nếu a = 0 thì (2) ⇔ b > 0. Khi đó : b ≤ 0 thì bất PT vô nghiệm;
 Lê Đắc Ước Tân Thành - ĐT: 0907090779
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 4
b > 0 thì bất PT có vô số nghiệm.
Nếu a > 0 thì bất phương trình có nghiệm là x > -
a
b
Nếu a < 0 thì bất phương trình có nghiệm là x < -
a
b
4. Hệ phương trình bậc nhất 2 ẩn số (Giải bằng định thức) :



=+
=+
'''

cybxa
cybxa

a b
D ab' - a'b
a' b'
 
 
 
= =

c b

D cb' - c'b
c' b'
x
 
 
 
= =

a c
D ac' - a'c
a' c'
y
 
 
 
= =
Nếu D = 0 thì : + Nếu D
x
≠ 0 hoặc D
y
≠ 0 thì hệ PT vô nghiệm;
+ Nếu D
x
= D
y
= 0 thì hệ PT có vô số nghiệm.
Nếu D ≠ 0 thì hệ PT có nghiệm duy nhất :
D
D
x

x
=

D
D
y
y
=
VI. SỐ GẦN ĐÚNG – SAI SỐ :
- Sai số là hiệu số giữa trị số đúng và trị số gần đúng.
- Nếu a là số gần đúng của số đúng thì được gọi là sai số
tuyệt đối của số gần đúng a.
- Nếu thì hay , ta nói a là số gần
đúng của với độ chính xác d, và qui ước viết gọn là
VII. GIẢI TÍCH TỔ HỢP :
1. Hoán vị :
- Cho tập hợp A có n phần tử (n >0). Khi sắp xếp n phần tử này theo một thứ
tự, ta được 1 hoán vị các phần tử của tập A.
- Số các hoán vị của một tập hợp có n phần tử là : P
n
= 1.2.3… (n-1).n
2. Chỉnh hợp :
- Cho tập hợp A gồm n phần tử. Mỗi cách sắp k phần tử của tập hợp A (1≤ k≤n)
theo một thứ tự nhất định gọi là một chỉnh hợp chập k của n phần tử của tập A.
- Số các chỉnh hợp chập k của một tập hợp có n phần tử ( ) là:
3. Tổ hợp :
- Cho tập hợp A gồm n phần tử. Mỗi cách sắp k phần tử của tập hợp A (1≤ k≤n)
(không quan tâm thứ tự) gọi là một tổ hợp chập k của n phần tử của tập A.
- Số các tổ hợp chập k của một tập hợp có n phần tử ( ) là:


VIII. HÌNH HỌC :
1. Định lí Py-ta-go : ∆ ABC vuông tại A ⇒ BC
2
= AB
2
+ AC
2
.
2. Hệ thức lượng trong ∆ vuông : b
2
=ab’(c
2
=ac’); h
2
=b’c’;
2 2 2
1 1 1
h b c
= +
 Lê Đắc Ước Tân Thành - ĐT: 0907090779
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 5
Chương II : MỘT SỐ VẤN ĐỀ CƠ BẢN TRONG PASCAL
I. GIẢI THUẬT :
1. Khái niệm :
- Giải thuật (còn gọi là thuật toán) là một tập hữu hạn các thao tác (các công
việc, các phép toán…) có thể đặt tên được và chúng được thực hiện theo một
trình tự thích hợp đối với một số đối tượng nào đó để đạt được điều mong muốn.
2. Biểu diễn giải thuật :
Thông thường, người ta sử dụng một trong 4 cách sau để biểu diễn giải thuật :
- Liệt kê : Là hình thức liệt kê từng bước bằng ngôn ngữ tự nhiên.

- Lưu đồ : Là hình thức biểu diễn giải thuật dưới dạng sơ đồ.
- Dùng ngôn ngữ lập trình.
- Dùng ngôn ngữ mã giả.
II. CÁC PHÉP TOÁN CƠ BẢN - LỆNH GÁN :
1. Các phép tính : + ; - ; * ; / (chia cho thương là số thực); DIV (chia lấy phần
nguyên); MOD (Chia lấy phần dư).
2. Các phép so sánh : > ; < ; = ; <> ; >= ; <=
3. Các phép Logic : AND (và); OR (hoặc); XOR (hoặc triệt tiêu); NOT (phủ định)
A B A and B A or B A xor B not A
True True True True False False
True False False True True False
False True False True True True
False False False False False True
4. Phép gán (Lệnh gán) : V := E; {V là 1 biến, E là biểu thức. VD : X := -b/a; }
III. CÁC KHAI BÁO : (Thường theo thứ tự như sau)
1. Khai báo tên chương trình : PROGRAM <Tên chương trình>;
2. Khai báo sử dụng đơn vị chương trình : USES <DS đơn vị chương trình>;
3. Khai báo nhãn : LABEL <Tên nhãn>;
4. Khai báo hằng : CONST <tên hằng> = <Giá trị>; VD : Const Pi=3.14;
5. Khai báo kiểu dữ liệu mới : TYPE <Tên kiểu DL mới>=Định nghĩa kiểu;
6. Khai báo biến : VAR <DS biến 1> : <Kiểu DL 1>; <DS biến 2> : <Kiểu DL 2>;
7. Khai báo thủ tục (một dạng chương trình con) :
PROCEDURE <Tên thủ tục> (Các tham số nếu cần);
8. Khai báo hàm (một dạng chương trình con) :
FUNCTION <Tên hàm> (Các tham số nếu cần) : <Kiểu DL của hàm>;
 Lê Đắc Ước Tân Thành - ĐT: 0907090779
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 6
IV. CÁC KIỂU DỮ LIỆU ĐƠN GIẢN :
Integer, Real, Char, String, Boolean, String, String [k], đoạn con, liệt kê
 Mở rộng kiểu số nguyên :

Từ khai báo Phạm vi biểu diễn Kích thước (Byte)
BYTE 0 255 1
SHORTINT -128 +128 1
INTEGER -32768 32767 2
WORD 0 65535 2
LONGINT -2147483648 2147483647 4
 Mở rộng kiểu số thực :
Từ khai báo Phạm vi biểu diễn Chữ số có nghĩa Kích thước (Byte)
REAL 2.9E-39 1.7E+38 11-12 6
SINGLE 1.5E- 45 3.4E+38 7-8 4
DOUBLE 5.0E-324 1.7E+308 15-16 8
EXTENDED 3.4E- 4951 1.1E+4932 19-20 10
(Thông thường chỉ dùng kiểu Real. Muốn sử dụng các kiểu thực
khác thì phải dùng hướng dẫn dịch {N+} ở đầu chương trình)
V. CÁC THỦ TỤC CƠ BẢN CỦA TP :
1. Thủ tục nhập : READ
- Read (DS biến); hoặc Readln (DS biến); {Nhập vào biến giá trị từ bàn phím}
- Read (F, DS biến); hoặc Readln (F, DS biến); {Đọc từ tệp F vào DS biến}
- Readln; {Chờ nhấn phím Enter}
Thủ tục nhập đặc biệt: Readkey;
{Cho kí tự khi gõ phím mà không cần nhấn Enter}
Hàm KeyPressed
cho giá trị True nếu bàn phím có kí tự gõ, ngược lại có giá trị False.
2. Thủ tục xuất : WRITE
- Write (DS dữ liệu xuất); hoặc Writeln (DS dữ liệu xuất); {Xuất ra màn hình}
- Write (n:d); hoặc Writeln (n:d); {Dành d vị trí để xuất biến nguyên}
- Write (x:d:d1); hoặc Writeln (x:d:d1);
{Dành d vị trí để xuất biến thực với d1 kí số thập phân}
- Write (F, DSDL xuất); hoặc Writeln (F, DSDL xuất);{Ghi dữ liệu vào tệp F}
- Write (LST, DSDL xuất); hoặc Writeln (LST, DSDL xuất);{Xuất ra máy in}

- Writeln; {Xuống dòng}
- Write(#7); hoặc Write(Chr(7)); {Phát ra một tiếng chuông ở loa của máy}
3. Các thủ tục điều khiển màn hình :
ClrScr; {Xóa mành hình}
ClrEol; {Xóa từ vị trí con trỏ tới cuốn dòng}
DelLine; {Xóa toàn bộ dòng chứa con trỏ, sau đó dồn các dòng dưới lên}
InsLine; {Xen một dòng trắng vào màn hình từ vị trí con trỏ}
Gotoxy (Cột, dòng); {Chuyển tới tọa độ cột, dòng}
Hàm WhreX cho giá trị cột hiện thời. Hàm WhreY cho giá trị dòng hiện thời.
Textbackground (color) hoặc Textbackground (0 tới 15); {định màu nền}
TextColor (color) hoặc TextColor (số từ 0 tới 15); {định màu chữ}
 Lê Đắc Ước Tân Thành - ĐT: 0907090779
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 7
4. Một số thủ tục khác :
Goto Nhãn; {Nhảy vô điều kiện tới Nhãn trong chương trình}
Exit; {Ngừng thủ tục (thoát khỏi thủ tục)}
Halt; {Ngừng chương trình}
VI. MỘT SỐ CẤU TRÚC ĐIỀU KHIỂN :
1. Câu lệnh điều kiện IF :
Dạng 1 : IF <Điều kiện> THEN <Câu lệnh>;
Dạng 2 : IF <Điều kiện> THEN <Câu lệnh 1> ELSE <Câu lệnh 2>;
(Lưu ý : Trước ELSE của lệnh IF không được viết dấu chấm phẩy)
2. Câu lệnh lựa chọn CASE :
Dạng 1 Dạng 2
CASE <Biểu thức> OF CASE <Biểu thức> OF
<Giá trị 1> : <Câu lệnh 1>; <Giá trị 1> : <Câu lệnh 1>;
<Giá trị 2> : <Câu lệnh 2>; <Giá trị 2> : <Câu lệnh 2>;
. . . . . . . . . . . . . . . . . . . . . . . .
<Giá trị n> : <Câu lệnh n>; <Giá trị n> : <Câu lệnh n>;
END; ELSE <Câu lệnh n+1>;

END;
(Lưu ý : CASE kết thúc bằng END; Trước ELSE của CASE được chấm phẩy )
3. Điều khiển lặp FOR…TO/ FOR…DOWNTO :
Dạng 1 : FOR <Biến đếm> := <Trị đầu> TO <Trị cuối> DO <Câu lệnh>;
Dạng 2 : FOR <Biến đếm> := <Trị đầu> DOWNTO <Trị cuối> DO <Câu lệnh>;
4. Điều khiển lặp REPEAT…UNTIL : Ngừng lặp khi <Điều kiện> ĐÚNG.
REPEAT
<Câu lệnh 1>;
<Câu lệnh 2>;
<Câu lệnh 3>;

<Câu lệnh n>;
UNTIL <Điều kiện>;
5. Điều khiển lặp WHILE…DO : Ngừng lặp khi <Điều kiện> SAI.
WHILE Điều kiện DO Câu lệnh;
(Sau DO chỉ có 1 câu lệnh, do đó muốn lặp nhiều phát biểu ta phải dùng phát biểu ghép)
6. Lệnh ghép : Ở những chỗ ta chỉ được sử dụng 1 câu lệnh, nhưng ta lại muốn
sử dụng nhiều hơn 1 câu lệnh thì phải sử dụng lệnh ghép. Lệnh ghép có dạng :
BEGIN
<Câu lệnh 1>;
<Câu lệnh 2>;
<Câu lệnh 3>;

<Câu lệnh n>;
END;
 Lê Đắc Ước Tân Thành - ĐT: 0907090779
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 8
VII. CÁCH ĐẶT TÊN TRONG PASCAL - TỪ KHÓA:
1. Cách đặt tên trong Pascal (chương trình, biến, hằng, nhãn, thủ tục, hàm… ) :
Tên có thể được đặt bằng một dãy bao gồm chữ cái, chữ số, dấu “_” (gạch

nối dưới) nhưng bắt đầu của tên bắt buộc phải là một chữ cái. Tên không được có
khoảng trắng và tên không được trùng với từ khóa.
2. Từ khóa trong Pascal (Phải học thuộc lòng) :
And, Array, Begin, Case, Const, Div, Do, Downto, Else, End, File, For,
Function, Goto, If, In, Label, Mod, Nil, Not, Of, Or, Packed, Procedure,
Program, Record, Repeat, Set, String, Then, To, Type, Until, Uses, Var,
While, With.
VIII. MỘT SỐ THỦ TỤC VÀ HÀM :
1. Hàm xử lý số :
ABS (x) :
x
.
SQR (x) : x
2
.
SQRT (x) :
x
.
SUCC (n) : n+1.
PRED (n) : n-1.
TRUNC (x) : Lấy phần nguyên của x (bỏ phần thập phân).
ROUND (x) : Làm tròn x.
COS (x) : Cos x.
SIN (x) : Sin x.
ARTAN (x) : Arctg x.
EXP (b*LN(A)) : A
b
.
INC(i) : i:=i+1;
DEC(i) : i:=i-1;

ORD (ch) : Cho thứ tự của kí tự ch trong bảng ASCII
(VD : ORD (‘A’)=65, ORD (‘a’)=97).
CHR (i) : Cho kí tự có thứ tự là i trong bảng ASCII
(VD : CHR (65) = ‘A’).
ODD (n) : Cho giá trị True nếu n là số lẻ.
SOUND(F) : tạo âm thanh tần số F tính theo Hz cho đến khi gặp lệnh OSOUND.
NOSOUND; : Ngừng thực hiện hàm SOUND.
DELAY (T) : tạo thời gian trể T tính theo đơn vị Mili giây (T là số nguyên).
READKEY; : Nhận một kí tự từ bàn phím không đưa ra màn hình và không cần
gõ phím Enter. (VD : Ch := Readkey;)
WHEREX : Cho giá trị cột hiện thời của con trỏ.
WHEREY : Cho giá trị dòng hiện thời của con trỏ.
LENGTH (Chuỗi) : Cho độ dài thật của chuỗi.
<Chuỗi>[k] : cho kí tự thứ k trong chuỗi. Đặc biệt : Chuỗi [0]=Length(chuỗi).
VD : For i:=1 to length(st) do
If ord(st[i]) >= 97 then st[i] := chr(ord(st)-32);
{Duyệt chuỗi st để đổi chuỗi st bất kỳ thành chuỗi gồm toàn chữ in hoa}
LENGTH (S,P,N) : xóa trong chuỗi S đi N ký tự kể từ vị trí P.
POS (S1,S) : Tìm kiếm chuỗi S1 trong chuỗi S. (Hàm cho giá trị là vị trí đầu tiên)
 Lê Đắc Ước Tân Thành - ĐT: 0907090779
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 9
Chương III : CHƯƠNG TRÌNH CON : THỦ TỤC VÀ HÀM
I. THỦ TỤC (PROCEDURE) VÀ HÀM (FUNCTION) :
1. Xét ví dụ sau đây : Chương trình tính tổ hợp chập k của n phần tử.
Program Tinh_To_Hop_Chap_K_Cua_N_Phan_Tu;
Uses Crt;
Var n,k: Byte; Tohop : Real;
Procedure Nhap; {Thu tuc nhap du lieu}
Begin
Clrscr;

Write ('Nhap n : ');
Readln (n);
Write ('Nhap k : ');
Readln (k);
End;
Function GT (x : Byte) : Longint; {Ham tinh giai thua}
Var i : Byte; k : Longint;
Begin
i:=0;
k:=1;
While i<x do
Begin
i:=i+1;
k:=k*i;
End;
GT:=k;
End;
Begin {Main Program}
Nhap; {Goi thu tuc nhap}
Tohop := GT(n)/(GT(k)*GT(n-k));
{Dung ham GT(n) nhieu lan de tinh to hop chap k cua n phan tu}
Write('To hop chap ',k,' cua ',n,' phan tu la : ',Tohop:0:0);
Readln;
End. {Main Program}
- Ta nhận thấy trong chương trình có 2 chương trình con là : Thủ tục Nhap và
hàm GT. Các chương trình con này có thể gọi nhiều lần trong chương trình
chính. Nếu không có hàm GT thì chương trình chính sẽ rất rườm rà vì phải viết 3
lần đoạn chương trình tính giai thừa rồi mới gán giá trị cho biến Tohop.
2. Cách viết thủ tục và hàm :
 Lê Đắc Ước Tân Thành - ĐT: 0907090779

Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 10
- Cách viết các chương trình con cũng gần giống như chương trình chính, cũng
có thể có các phần khai báo (biến, hằng,…), thân thủ tục cũng trong cặp từ khóa
Begin … End nhưng kết thúc bằng dấu chấm phẩy.
3. Sự khác nhau giữa thủ tục và hàm :
- Sự khác nhau cơ bản giũa thủ tục và hàm là ở chỗ : Hàm cho ta kết quả là một
giá trị thông qua tên của nó, còn thủ tục thì chỉ thực hiện một khối thao tác mà
không cho kết quả qua tên thủ tục.
II. TRUYỀN THAM SỐ CHO CHƯƠNG TRÌNH CON :
III. BIẾN TOÀN CỤC VÀ BIẾN ĐỊA PHƯƠNG :
IV. TÍNH ĐỆ QUY CỦA CHƯƠNG TRÌNH CON :
 Lê Đắc Ước Tân Thành - ĐT: 0907090779
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 11
Chương IV : KIỂU DỮ LIỆU CÓ CẤU TRÚC
I. KIỂU MẢNG :
1. Khai báo :
- Cách 1 : TYPE <Kiểu mảng> = ARRAY [Chỉ số đầu Chỉ số cuối] OF
<Kiểu phần tử>;
VAR <Biến mảng> : <Kiểu mảng>;
VD : TYPE mangnguyen = ARRAY [1 10] OF Integer;
VAR A,B,C : mangnguyen;
- Cách 2 : VAR <Biến mảng> : ARRAY [Kiểu chỉ dẫn] OF <Kiểu phần tử>;
VD : VAR A,B,C : ARRAY [1 10] OF Integer;
2. Truy nhập vào phần tử mảng :
<Tên mảng> [Chỉ số] {VD: Viết A[5] là truy nhập vào phần tử thứ 5 của mảng A;
3. Duyệt mảng :
Dùng lệnh FOR duyệt qua từng phần tử của mảng để thao tác với phần tử.
VD : For i:=1 to 10 do {Nhập dữ liệu vào mảng A}
Begin
Writeln (‘A[‘,i,’]=’);

Readln (A[i]);
End;
For i:=1 to 10 do Writeln {‘A[‘,i,’]=’,A[i]); {Viết mảng A ra màn hình}
For i:=1 to 10 do C[i]:=A[i]+B[i]; {Gán giá trị cho mảng C}
4. Mảng nhiều chiều (còn gọi là ma trận) :
- Mảng 2 chiều :
Var X,Y,Z : Array [1 3,1 5] Of Integer; {Mảng X,Y,Z gồm 3 hàng, 5 cột}
- Duyệt để truy nhập vào phần tử mảng 2 chiều : Dùng 2 vòng FOR lồng nhau.
For i:=1 to 3 do
For j:=1 to 5 do
Z[I,J]:=X[I,J]+Y[I,J];
- Căn cứ vào cách khai báo và sử dụng mảng 1 chiều, mảng 2 chiếu, chúng ta
có thể xây dựng mảng n chiều.
II. KIỂU TẬP HỢP :
1. Khai báo :
III. KIỂU BẢN GHI :
1. Khai báo :
IV. KIỂU TỆP (FILE) :
1. Khai báo :
 Lê Đắc Ước Tân Thành - ĐT: 0907090779
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 12
Chương V : MỘT SỐ GIẢI THUẬT THÔNG DỤNG
I. GIẢI THUẬT XỬ LÝ SỐ :
1. Kiểm tra số nguyên tố :
Function SNT (x: Word) : Boolean; {Ham kiem tra so nguyen to theo dinh ly}
Var p: Integer; f : Boolean;
Begin
If x < 2 then
Begin
SNT := False;

Exit;
End;
p:=2;
f:= True;
While (p <= Sqrt(x)) and f do
If x mod p = 0 then
f := false
Else
p := p+1;
If f then
SNT:=True
Else
SNT:=False;
End;
2. Sàng số nguyên tố :
Procedure SSNT (n: Byte); {Thu tuc sang so nguyen to}
Var TapNT,Sang : Set of Byte;
p,i : Byte;
Begin
TapNT := []; {Tap chua so nguyen to. Khoi tao bang rong}
Sang := [2 n]; {Cai sang}
p := 2;
Repeat
While not(p in Sang) do p := p + 1;
TapNT := TapNT + [p];
i := p;
While i <= n do
Begin
Sang := Sang -[i];
i := i + p;

End;
Until Sang = [];
For i:=1 to n do
If i in TapNT then Write(i:5);
End;
3. Tìm ƯCLN(a,b) :
 Lê Đắc Ước Tân Thành - ĐT: 0907090779
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 13
Function UCLN (a,b : Integer) : Integer; {Thu tuc tim UCLN}
Begin
If (a=0) and (b<>0) then Begin UCLN:=b; Exit; End;
If (a<>0) and (b=0) then Begin UCLN:=a; Exit; End;
While a<>b do
If a>b then
a:=a-b
Else
b:=b-a;
UCLN:=a;
End;
Function UCLN (a,b : Integer) : Integer; {Tim UCLN bang chia lay phan du}
Var r : Integer;
Begin
While b<>0 do
Begin
r:=a mod b;
a:=b;
b:=r;
End;
UCLN:=a;
End;

Function UCLN (a,b : Integer) : Integer; {Tim UCLN bang de quy}
Begin
If b=0 then
UCLN:=a
Else
UCLN:=UCLN(b,a mod b);
End;
Lưu ý : Tính BCNN(a,b) theo công thức : BCNN(a,b) = a*b div UCLN(a,b))
Function UCLN (a,b : Integer) : Integer; {Thu tuc tim UCLN bang de quy}
Begin
If b=0 then
UCLN:=a
Else
UCLN:=UCLN(b,a mod b);
End;
 Lê Đắc Ước Tân Thành - ĐT: 0907090779
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 14
4. Đổi từ cơ số thập phân sang cơ số khác :
…………
5. Đổi từ cơ số khác sang cơ thập phân :
…………
6. Tính lũy thừa X
n
:
…………
7. Tính giai thừa :
…………
II. GIẢI THUẬT XỬ LÝ CHUỖI :
1. Đổi chuỗi kí tự thường sang kí tự in hoa :
…………

2. Đổi chuỗi kí tự in hoa sang kí tự thường :
…………
3. Cắt các khoảng trắng bên trái chuỗi :
…………
4. Cắt các khoảng trắng bên phải chuỗi :
…………
5. Cắt các khoảng trắng bên phải chuỗi :
…………
6. Cắt các khoảng trắng ở cả hai bên chuỗi :
…………
7. Trích một số kí tự từ bên trái chuỗi :
…………
8. Trích một số kí tự từ bên phải chuỗi :
…………
9. Đổi chuỗi thành dạng tên riêng:
…………
III. GIẢI THUẬT XỬ LÝ TRÊN DÃY :
1. Tìm phần tử lớn nhất của 1 dãy :
…………
2. Sắp xếp :
…………
3. Tìm kiếm :
…………
 Lê Đắc Ước Tân Thành - ĐT: 0907090779
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 15
IV. MỘT SỐ PHƯƠNG PHÁP KHÁC :
1. Phương pháp Thử sai :
Phương pháp thử sai là phương pháp từng bước xem tính chất của đối
tượng, nếu đúng thì lưu lại và tiếp tục, nếu sai thì bỏ qua và lùi lại một bước
trước đó.

Ví dụ : Lập chương trình xây dựng một dãy gồm N chữ số (N là số nguyên
nhập từ bàn phím) từ 3 chữ số cho trước 1, 2, 3 sao cho không có hai dãy con chữ
số liên tiếp nào giống nhau. Chẳng hạn, với N=10, ta có dãy 1213123132 là chấp
nhận được, còn dãy 1213 121312 là không chấp nhận được; với N=20, ta có dãy
12131231321231213123 là chấp nhận được, còn dãy 121312313 12131231312 là
không chấp nhận được.
Để giải quyết bài toán này, ta dùng một biến chuỗi S lưu trữ dãy đang xây
dựng. Ta từng bước kiểm tra xem trong chuỗi S có 2 chuỗi con liên tiếp nào
giống nhau hay không. Giả sử độ dài chuỗi S (đến thời điểm hiện tại đang kiểm
tra) là m=Length(S) thì 2 chuỗi con liên tiếp cần kiểm tra có độ dài không vượt
quá L=m div 2.
 Hàm Copy :
Cú pháp : Copy (S : String, P : Integer, N : Integer)
Ý nghĩa : Hàm cho giá trị là xâu ký tự con có N ký tự được lấy ra từ xâu
ký tự S bắt đầu từ vị trí thứ P.
Ta tăng L từ 1 đến m div 2 để tách các chuỗi con có 1, 2, 3, …, L ký tự từ
chuỗi S và so sánh bằng biểu thức :
Copy(S,m-2*L+1,L)<>Copy(S,m-L+1,L)
Nếu chuỗi S tốt (Good) thì ta cho kéo đỗ dài chuỗi S bằng thủ tục Extend,
nếu chuỗi S là không tốt (có 2 chuỗi con liên tiếp giống nhau) thì ta thay đổi
chuỗi S bằng thủ tục change. Chương trình hoàn chỉnh như sau :
Program Taobangkyhieu;
Uses Crt;
Var S:String;
N:Integer;
Good:Boolean;
Procedure Extend;
Begin
S:=S+'1';
End;

Procedure Change;
Begin
While S[Length(S)]='3' do
S:= Copy(S,1,Length(S)-1);
S[Length(S)]:= Succ(S[Length(S)]);
End;
Procedure Check;
 Lê Đắc Ước Tân Thành - ĐT: 0907090779
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 16
Var L,m:Integer;
Begin
Good:=True; L:=0; m:=Length(S);
While Good and (L < m div 2) do
Begin
L:=L+1;
Good:= Good and (Copy(S,m-2*L+1,L)<>Copy(S,m-L+1,L));
End;
End;
Begin {Main program}
Clrscr;
Repeat Write('Nhap N : '); Readln(N); Until N>1;
S:='1';
Good:=True;
Repeat
If Good then Extend Else Change;
Check;
Until (Good and (Length(S)=N)) or (S='');
If Good then Writeln('S=',S) else Writeln('Vo nghiem');
Readln;
End.

2. Phương pháp Vét cạn :
Phương pháp vét cạn là phương pháp duyệt qua tất cả mọi trường hợp
có thể xảy ra và chọn lựa xem trường hợp đang xét có thỏa mãn yêu cầu của
đề bài hay không.
Ví dụ : Lập chương trình tìm tất cả các số có 3 chữ số abc sao cho tổng các
lập phương của các chử số thì bằng chính số đó. Có nghĩa là : abc = a
3
+b
3
+c
3
.
Trong trường hợp này, ta sẽ cho máy tính quét hết các khả năng các số có
3 chữ số và thử. Đó chính là “Vét cạn”.
Cách 1 : ta dùng 3 vòng lặp
Program Vetcan1;
Uses Crt;
Var a,b,c:Integer;
Begin
Clrscr;
For a:=1 to 9 do
For b:=0 to 9 do
For c:=0 to 9 do
If a*a*a+b*b*b+c*c*c = 100*a+10*b+c then
Writeln(a,b,c);
Readln;
End.
Cách 2 : ta dùng 1 vòng lặp
Program Vetcan2;
 Lê Đắc Ước Tân Thành - ĐT: 0907090779

Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 17
Uses Crt;
Var a,b,c,i:Integer;
Begin
Clrscr;
For i:=100 to 999 do
Begin
a:= i div 100;
b:= (i div 10) mod 10;
c:= i mod 10;
If a*a*a+b*b*b+c*c*c = 100*a+10*b+c then
Writeln(a,b,c);
End;
Readln;
End.
BÀI TẬP
Bài 1 : Lập chương trình tìm tất cả các cách thay thế các dấu chấm hỏi (?)
bởi các dấu phép tính +, -, *, / trong biểu thức dưới dây :
(((((a
1
? a
2
) ? a
3
) ? a
4
) ? a
5
) ? a
6

) = a
7
Trong đó a
1
, a
2
, a
3
, a
4
, a
5
, a
6
, a
7
là số thực nhập từ bàn phím.
Bài 2 : Lập chương trình tìm cách điền 9 chữ số khác nhau 1, 2, 3, 4, 5, 6,
7, 8, 9 vào bảng vuông 3x3 sao cho a’b’c’=2a”b”c”=3abc (như hình vẽ dưới).
a b c
a’ b’ c’
a” b” c”
V. KỸ THUẬT DUYỆT ĐỆ QUY QUAY LUI (BACKTRACKING) :
Kỹ thuật quay lui (Backtracking) như tên gọi của nó, là một quá trình phân
tích đi xuống. Tại mỗi bước phân tích chúng ta chưa giải quyết được vấn đề do
còn thiếu cứ liệu nên cứ phải phân tích cho tới các điểm dừng, nơi chúng ta xác
định được lời giải của chúng hoặc là xác định được là không thể (hoặc không
nên) tiếp tục theo hướng này. Từ các điểm dừng này chúng ta quay ngược trở lại
theo con đường mà chúng ta đã đi qua để giải quyết các vấn đề còn tồn đọng và
cuối cùng ta sẽ giải quyết được vấn đề ban đầu.

Người ta thường sử dụng 3 kỹ thuật quay lui: “vét cạn” là kỹ thuật phải đi
tới tất cả các điểm dừng rồi mới quay lui. “Cắt tỉa Alpha-Beta” và “Nhánh-Cận”
là hai kỹ thuật cho phép chúng ta không cần thiết phải đi tới tất cả các điểm
dừng, mà chỉ cần đi đến một số điểm nào đó và dựa vào một số suy luận để có
thể quay lui sớm.
Về mặt lý luận, chúng ta có thể phân tích kỹ thuật Quay lui như sau :
Giả thiết một cấu hình cần tìm được mô tả bởi một bộ phận gồm n thành
phần a1, a2, an. Giả sử tìm được i - 1 thành phần a1, a2, ai-1, ta tìm thành phần
thứ i bằng cách duyệt tất cả các khả năng có thể của ai. Với mỗi khả năng j kiểm
tra xem nó có chấp nhận được không. Xảy rahai trường hợp :
Nhận được thì xác định ai theo j và kiểm tra xem i = n chưa, nếu i = n thì
ta ghi nhận một cấu hình, còn nếu i < ta gọi tiến hành xác định ai+1.
 Lê Đắc Ước Tân Thành - ĐT: 0907090779
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 18
Nếu thử tất cả các khả năng mà không có khả năng nào chấp nhận được thì
quay lại bước trước xác định lại ai-1
Nội dung của thuật toán này rất phù hợp với việc gọi đệ quy. Ta có thủ tục
đệ quy sau đây:
Procedure Try(i: Integer);
Begin
for {mọi giá trị có thể gán cho xi} do
begin
<Thử cho xi := V>;
if (xi là phần tử cuối cùng trong cấu hình) then
<Thông báo cấu hình tìm được>
Else
Begin
<Ghi nhận việc cho xi nhận giá trị V (Nếu cần)>;
Try(i + 1); {Gọi đệ qui để chọn tiếp xi + 1}
<Nếu cần, bỏ ghi nhận việc thử xi := V, để thử giá trị khác>;

end;
end;
end;
Ví dụ : chương trình xếp n quân hậu trên bàn cờ có n*n ô sao cho không quân
nào ăn được quân nào. Chẳng hạn, với bàn cờ 8x8=64 ô, ta có một trong 92
cách xếp như sau :
Giả sử bàn cờ 4x4, ta làm như sau :
 Lê Đắc Ước Tân Thành - ĐT: 0907090779
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 19

Giải: Ta xếp n con hậu trên n dòng, theo nguyên lý nhân ta có n
n
cách sắp.
Để làm điều đó ta dùng thủ tục đệ quy mô tả ở trên để giải. Ta đánh ghi số cột và
dòng của bàn cờ từ 1 đến n, mỗi cách sắp xếp ứng với 1 bộ gồm a
1
,a
2
, ,a
n
với a
i
= j (j=1,2, ,n) có nghĩa là con hậu thứ i đặt vào cột j. Giả sử ta chọn được i-1 con
hậu bằng cách duyệt tất cả các khả năng của nó.
Quan trọng nhất là ta tìm điều kiện chấp nhận j, một con hậu đứng ở một ô
trong bàn cờ nó có nhiều nhất bốn hướng đi(đường dọc, đường ngang và hai
đường chéo).
Vậy điều kiện chấp nhận thứ i thoả mãn không nằm trên đường đi của tất
cả i-1 con hậu đã xếp. Bởi vì n con hậu xếp ở hàng nên đường đi ngang của
chúng là không chiến nhau, do đó khi chọn con hậu thư i chỉ cần kiểm tra xem

trên 2 đường chéo và đường dọc của chúng có chiếu vào những con hậu đã xếp
không? Để kiểm tra điều này mỗi đường ta dùng một biến trạng thái.
* Đường dọc kiểm soát bằng biến b[j],(j=1,2, ,n).
* Một đường chéo kiểm soát bằng biến c[i+j],i+j={2, ,2n}.
* Còn đường chéo kia kiểm soát bằng biến d[i-j],i-j={1-n, ,n-1}.
Các biến trạng thái này khởi gán giá trị True trong thủ tục Init. Như vậy
con hậu thứ i được chấp nhận xếp vào cột j nếu nó thoả mãn cả ba biến
b[j],c[i+j],d[i-j] đều có giá trị true. Các biến này gán giá trị False khi xếp xong
con hậu thứ i, và trả lại giá trị true sau khi gọi Result hay Try(i+1). Ta có chương
trình Pascal sau :
Program Xep8hau;
Uses Crt;
Const Max=15;
Var x : Array [1 Max] of Integer;
a : Array [1 Max] of Boolean;
b : Array [1 Max*2] of Boolean;
c : Array [-Max Max] of Boolean;
 Lê Đắc Ước Tân Thành - ĐT: 0907090779
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 20
n,i,dem : Integer;
Procedure Print;
Var j : Integer;
Begin
Dem:=Dem+1;
Write(dem,')');
For j:= 1 to n do Write(x[j]:3);
Writeln;
End;
Procedure Try (i : Integer);
Var j: Integer;

Begin
If i > n then
Print
Else
For j:=1 to n do
If Not(a[j]) and Not(b[i+j]) and Not(c[i-j]) then
Begin
x[i]:=j;
a[j]:=True;
b[i+j]:=True;
c[i-j]:=True;
Try(i+1);
a[j]:=False;
b[i+j]:=False;
c[i-j]:=False;
End;
End;
Procedure Init;
Var j : Integer;
Begin
Fillchar (a,sizeof(a),False);
Fillchar (b,sizeof(b),False);
Fillchar (c,sizeof(c),False);
End;
Begin {Main Program}
Clrscr;
Repeat
Write('Nhap n (n<=',Max,') : ');
Readln(n);
 Lê Đắc Ước Tân Thành - ĐT: 0907090779

Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 21
Until n<=Max;
Dem:=0;
Writeln('Cac cach xep :');
Init;
Try(1);
Readln;
End. {Main Program}
Ta có thể dùng mảng 2 chiều để nhớ trạng thái bàn cờ, và cải tiến
chương trình như sau :
Program Xephau;
Uses Crt;
Label Xettiep;
Const Max = 8;
Var Songhiem : Integer;
Banco : Array [1 Max,1 Max] of Boolean;
Daxet : Array [1 Max] of Integer;
n,i,j,h,c : Integer;
Hang, Dangxet : Integer;
{****************************************}
Procedure HienKetqua; {Dung de hien mot ket qua}
Var h,c : Integer;
Begin
Songhiem := Songhiem + 1; writeln('Nghiem thu : ',Songhiem);
For h:=1 to n do
Begin
For i:=1 to n*2 do Write('Ä'); Writeln;
For c:=1 to n do if Banco[c,h] then Write('³x') else Write('³ ');
Writeln('³');
End;

For i:=1 to n*2 do write('Ä');
End;
{****************************************}
Function Deduoc(h,c: Integer) : Boolean; {Kiem tra xem co de duoc con hau o vi
tri h,c ? }
Begin
Deduoc := False;
{Kiem tra xem hang h da co con hau nao chua ?}
for i:= 1 to c do
if banco[h,i] then exit;
{ Kiem tra xem duong cheo tu tren trai xuong duoi phai }
{ xuyen qua vi tri h,c da co con hau nao chua ?}
i:= h-1; j:= c-1;
While (i>0) and (j>0) do
 Lê Đắc Ước Tân Thành - ĐT: 0907090779
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 22
Begin
If banco[i,j] then exit;
i:=i-1;
j:=j-1;
End;
{ Kiem tra xem duong cheo tu tren phai xuong duoi trai }
{ xuyen qua vi tri h,c da co con hau nao chua ?}
i:= h+1; j:= c-1;
While (i<=n) and (j>0) do
Begin
If banco[i,j] then exit;
i:=i+1;
j:=j-1;
End;

Deduoc := True
End;
{****************************************}
Begin {Main Program}
clrscr;
Write('Nhap n : ');
Readln(n);
{Xoa ban co}
for h:=1 to n do
for c:=1 to n do banco[h,c]:= False;
Songhiem := 0;
Dangxet := 0;
{Lap tim nghiem theo ky thuat backtracking}
Xettiep: {Dat nhan xet tiep}
Dangxet := Dangxet+1;
Hang:=1;
Repeat
While Hang <= n do
Begin
If Deduoc(Hang,Dangxet) then
Begin
Banco[Hang,Dangxet] := True;
If Dangxet = n then
Begin {tim duoc nghiem}
Hienketqua;
Readln;
Banco[hang,dangxet] := False;
End
Else
Begin

 Lê Đắc Ước Tân Thành - ĐT: 0907090779
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 23
Daxet[Dangxet] := Hang; {giu lai hang da xet}
goto Xettiep;
End;
End;
Hang := Hang+1;
End;
Dangxet := Dangxet - 1; {Lui lai con hau truoc}
if Dangxet = 0 then Exit; { da thu het cac kha nang }
Hang := Daxet[Dangxet]; {Lay lai hang da xet}
Banco[Hang,Dangxet] := False;
Hang := Hang + 1; {Tiep tuc xet tiep}
Until False;
End.
 Lê Đắc Ước Tân Thành - ĐT: 0907090779
Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 24
3. Phương pháp Hướng đích :
…………
4. Phương pháp Quy hoạch động :
…………
5. Phương pháp Tham lam :
Giải thuật tham lam (Greedy algorithm) là một thuật toán giải quyết một
bài toán theo kiểu metaheuristic để tìm kiếm lựa chọn tối ưu địa phương ở mỗi
bước đi với hy vọng tìm được tối ưu toàn cục. Chẳng hạn áp dụng giải thuật tham
lam với bài toán hành trình của người bán hàng ta có giải thuật sau: "Ở mỗi bước
hãy đi đến thành phố gần thành phố hiện tại nhất".
Nói chung, giải thuật tham lam có năm thành phần:
Một tập hợp các ứng viên (candidate), để từ đó tạo ra lời giải
Một hàm lựa chọn, để theo đó lựa chọn ứng viên tốt nhất để bổ sung vào

lời giải
Một hàm khả thi (feasibility), dùng để quyết định nếu một ứng viên có thể
được dùng để xây dựng lời giải
Một hàm mục tiêu, ấn định giá trị của lời giải hoặc một lời giải chưa hoàn
chỉnh
Một hàm đánh giá, chỉ ra khi nào ta tìm ra một lời giải hoàn chỉnh.
Có hai thành phần quyết định nhất tới quyết định tham lam:
Tính chất lựa chọn tham lam
Chúng ta có thể lựa chọn giải pháp nào được cho là tốt nhất ở thời điểm
hiện tại và sau đó giải bài toán con nảy sinh từ việc thực hiện lựa chọn vừa rồi.
Lựa chọn của thuật toán tham lam có thể phụ thuộc vào các lựa chọn trước đó.
Nhưng nó không thể phụ thuộc vào một lựa chọn nào trong tương lai hay phụ
thuộc vào lời giải của các bài toán con. Thuật toán tiến triển theo kiểu thực hiện
các chọn lựa theo một vòng lặp, cùng lúc đó thu nhỏ bài toán đã cho về một bài
toán con nhỏ hơn. Đấy là khác biệt giữa thuật toán này và giải thuật quy hoạch
động. Giải thuật quy hoạch động duyệt hết và luôn đảm bảo tìm thấy lời giải. Tại
mỗi bước của thuật toán, quy hoạch động đưa ra quyết định dựa trên các quyết
định của bước trước, và có thể xét lại đường đi của bước trước hướng tới lời giải.
Giải thuật tham lam quyết định sớm và thay đổi đường đi thuật toán theo quyết
định đó, và không bao giờ xét lại các quyết định cũ. Đối với một số bài toán, đây
có thể là một thuật toán không chính xác.
Cấu trúc con tối ưu
Một bài toán được gọi là "có cấu trúc tối ưu", nếu một lời giải tối ưu của
bài toán con chứa lời giải tối ưu của bài toán lớn hơn.
Đối với nhiều bài toán, giải thuật tham lam hầu như không cho ra lời giải
tối ưu toàn cục (nhưng không phải luôn như vậy), vì chúng thường không chạy
trên tất cả các trường hợp. Chúng có thể bám chặt lấy một số lựa chọn nhất định
một cách quá sớm, điều này dẫn đến hậu quả là trong giai đoạn sau, các thuật
toán này không thể tìm ra các lời giải toàn cục tốt nhất. Ví dụ, đối với bài toán tô
 Lê Đắc Ước Tân Thành - ĐT: 0907090779

Tài liệu bồi dưỡng học sinh giỏi tin học bậc THCS Trang 25
màu đồ thị và tất cả các bài toán NP-đầy đủ khác, không một thuật toán tham lam
đã được biết nào đảm bảo tìm thấy các lời giải tối ưu. Tuy nhiên, các thuật toán
này vẫn hữu ích vì chúng dễ thiết kế và cho ra các ước lượng tốt về lời giải tối
ưu.
Nếu có thể chứng minh rằng một thuật toán tham lam cho ra kết quả tối ưu
toàn cục cho một lớp bài toán nào đó, thì thuật toán thường sẽ trở thành phương
pháp được chọn lựa, vì nó chạy nhanh hơn các phương pháp tối ưu hóa khác như
quy hoạch động. Các ví dụ cho giải thuật loại này là thuật toán Kruskal và thuật
toán Prim dành cho bài toán cây bao trùm nhỏ nhất, thuật toán Dijkstra dành cho
bài toán đường đi ngắn nhất nguồn đơn, và thuật toán tìm cây Huffman tối ưu.
Chương trình giải bài toán người bán hàng bằng phương pháp tham lam
(viết bằng ngôn ngữ c ++)với ma trận trọng số của đồ thị như sau:
0 15 30 50 20
15 0 10 35 32
30 10 0 15 40
50 35 15 0 43
20 32 40 43 0
chương trình :
#include "iostream"
#include "fstream"

using namespace std;
int n,a[25][25],b[25],k;
int NhapFile(char TenFile[], int &n)
{
ifstream iFile;
iFile.open(TenFile);
if (!iFile.is_open())
return 0;

while(iFile >> n)
{
for (int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
iFile >> a[i][j];
}
}
}
iFile.close();
return 1;
}

int check(int x, int y[], int s)
{
for(int i=0;i<s;i++)
{
if(x==y[i])
return 0;
}
return 1;
 Lê Đắc Ước Tân Thành - ĐT: 0907090779

×