SlideShare a Scribd company logo
1 of 31
I. BÀI TẬP CĂN BẢN
Bài 1. Xét hai giải thuật tính gần đúng ex
bằng công thức: ex
= 1+x/1!+x2
/2!+…+xn
/n! (x,n
cho trước). 1+2/1+4/2=4
+ Giải thuật 1: Tính từng số hạng rồi cộng lại
+ Giải thuật 2: Dựa vào số hạng trước, tính số hạng sau
1) Trình bày các bước thực hiện giải thuật 1 và 2.
2) Đánh giá hai giải thuật
Bài 2. Liệt kê tất cả các dãy nhị phân chiều dài bằng n(Bằng giải thuật sinh)
Bài 3. Liệt kê các hoán vị của tập X={1,…,n}
Bài 4. Liệt kê các tổ hợp chặp m của tập X={1,…,n}
Bài 5. Liệt kê các chỉnh hợp không lặp chặp m của tập X={1,…,n}
Bài 6. Liệt kê các chỉnh hợp lặp chặp m của tập X={1,…,n}
II. BÀI TẬP MẢNG
Bài 1. Tìm cách chia mảng nguyên dương n phần tử cho trước thành hai đoạn có tổng các
phần tử trong mỗi đoạn bằng nhau.
Bài 2. Tìm cách chia mảng nguyên dương n phần tử cho trước thành hai đoạn có tổng các
phần tử trong mỗi đoạn này bằng k lần tổng các phần tử trong đoạn kia với k là số nguyên
dương.
Bài 3. Cho trước mảng 2 chiều A[1:n][1:n], mỗi phần tử của nó bằng 0, 1, 5 hoặc 11. Hãy
tính số lượng các bộ bốn A[i,j], A[i+1,j], A[i, j+1], A[i+1, j+1] trong đó các phần tử đều
khác nhau.
Bài 4. Cho trước mảng 1 chiều. Chuyển các phần tử khác không về đầu dãy và các phần tử
bằng không về cuối dãy mà vẫn giữ nguyên trật tự trước sau của các phần tử khác không.
Không dùng 1 mảng phụ.
Bài 5. Trong mảng A[1:n] (với n khá lớn) chỉ chứa các số 0, 1, 2. Hoán vị các phần tử sao
cho đầu mảng chứa số 1, giữa mảng chứa số 2 và cuối mảng chứa số không. Không dùng 1
mảng phụ.
Bài 6. Một mảng chứa N cặp số (ai, bi) tương ứng với N đường thẳng yi = aix + bi . Các
đường thẳng được sắp xếp trong đoạn [0,1] trên trục x với ý nghĩa sau: yi < yi+1 với mọi
giá trị i giữa 0 và N-2, và với mọi giá trị của x trên đoạn [0,1]
Trình bày thuật toán và viết chương trình con để xác định nhanh 2 đường gần nhất
“bao quanh” điểm P(xP, yP) cho trước với 0 ≤ xP ≤ 1
1
Bài 7. Tìm các số tự nhiên lẻ có ba chữ số. Ba chữ số này theo trận tự viết từ trái sang phải
tạo thành cấp số cộng.
Bài 8. Tìm các số tự nhiên lẻ có ba chữ số. Ba chữ số này theo trận tự viết từ trái sang phải
tạo thành cấp số nhân.
Bài 9. Cho trước số tự nhiên n. Tìm tất cả các ước số nguyên tố khác nhau của nó.
Bài 10. Viết chương trình liệt kê tất cả các số tự nhiên K thỏa mã đồng thời những điều kiện
sau:
a. K là số có 5 chữ số.
b. K là số nguyên tố.
c. Đảo ngược các chữ số trong K ta cũng nhận được một số nguyên tố.
d. Tổng các chữ số của K cung là số nguyên tố.
Kết quả ghi vào file ketqua.out có dạng như sau: dòng đầu tiên ghi số lượng số K tìm được,
các dòng tiếp theo ghi các số K, mỗi dòng 5 số.
Bài 11. Một ma trận vuông A chỉ có các phần tử thuộc đường chéo chính và hai đường
chéo sát đường chéo chính là khác không (a[i,j]=0 nếu |i-j|>1). Ma trận A có dạng
X X 0 0 0
X X X 0 0
0 X X X 0
0 0 X X X
0 0 0 X X
Để tiết kiệm bộ nhớ ta chỉ lưu trữ các phần tử khác không bằng mảng 1 chiều. Viết hàm
nhập, xuất, cộng hai ma trận dạng này.
Bài 12. Viết chương trình tìm ma trận nghịch đảo và đánh giá độ phức tạp của chương trình.
III. KỸ THUẬT ĐỆ QUY
Bài 1. Cho dãy an như sau:
a0 =1; a1=0; a2 =-1;
an = 2an-1 – 3an-2 - an-3 (n>2)
Viết chương trình tính số hạng thứ n của dãy bằng hai cách:
a) Sử dụng kỹ thuật đệ qui.
b) Không sử dụng kỹ thuật đệ qui.
Bài 2. Liệt kê tất cả các dãy nhị phân chiều dài bằng n
Bài 3. Liệt kê các hoán vị của tập X={1,…,n}
Bài 4. Liệt kê các tổ hợp chặp m của tập X={1,…,n}
Bài 5. Cho dãy gồm n số, tìm các dãy con có tổng bằng m.
Bài 6. Cho dãy gồm n số, tìm các dãy con có k phần tử và có tổng bằng m.
Bài 7. Cho dãy n số nguyên và một số k, xuất ra tất cả các dãy con giảm có k phần tử (dãy
con có thể liên tiếp hoặc không liên tiếp và có thể có phần tử trùng).
Ví dụ: dãy 5 2 4 3 1 có các dãy con 3 phần tử và giảm là: 5 2 1; 5 4 3; 5 4 1; 5 3 1; 4 3 1
2
IV. STACK & QUEUE
Bài 1. Viết chương trình đổi số thập phân sang cơ số b (2,8,16).
Bài 2. Viết hàm tính giá trị của biểu thức dưới dạng hậu tố chỉ bao gồm: các dấu mở
ngoặc/đóng ngoặc; 4 toán tử cộng, trừ, nhân và chia (+, -, *, /); các toán hạng đều chỉ là các
con số nguyên từ 0 đến 9; không có bất kỳ khoảng trắng nào giữa các ký tự.
Bài 3. Dùng dslk đơn có nút head để lưu trữ một tập hợp các số nguyên.
a) Viết hàm xét một phần tử có thuộc tập hợp hay không?
b) Viết các hàm tìm giao, hợp, hiệu hai tập hợp.
c) Viết hàm xét một tập có là một tập con của một tập cho trước hay không?
Bài 4. Tàu theo lối vào, vào xưởng sửa chữa, sửa xong ra theo lối ra. Biết rằng tàu vào sau
sẽ được sửa trước.
Ví dụ: có 4 đầu tàu xếp hàng sửa chữa theo thứ tự 1,2,3,4 ; nếu thực hiện các lệnh vào/ra
theo thứ tự sau: VVRVVRRR thì thứ tự lúc ra là: 2, 4,3,1.
Xét 6 đầu tàu xếp hàng sửa chữa theo thứ tự 1,2,3,4,5,6. Cho biết dãy lệnh vào/ra như thế
nào để có thứ tự lúc ra là:
a) 3,2,5,6,4,1
b) 1,5,4,6,3,2
Bài 5. Vũ trường ABC mỗi tối thứ bảy có tổ chức khiêu vũ cho các cặp nam-nữ. Cặp đầu
tiên là người nam đến đầu tiên và người nữ đến đầu tiên, cặp thứ hai là người nam đến thứ
hai và người nữ đến thứ hai, …. Hãy viết chương trình dùng hàng đợi, nhập những người đi
dự buổi khiêu vũ (nhập tên và giới tính), sau đó xuất ra màn hình từng cặp khiêu vũ và các
người còn dư.
Bài 6.
a. Dùng stack viết chương trình đổi số thập phân sang cơ số b (2,8,16).
HD:
vàora
Xưởng
sửa chữa
3
132162032112101011data0123
top
Chia 13 cho 2 cho tới khi thương số bằng 0
thì ngừng.
Các số dư cất vào stack, sau đó lấy ra, kết
quả là:
1310
= 11012
.
b. Dùng stack viết chương trình tháp Hà Nội không đệ qui: In ra các bước dời n đĩa
từ A sang B, C trung gian. Yêu cầu là mỗi lần chỉ được dời một đĩa và không
được để đĩa lớn trên đĩa nhỏ.
HD: G/s dời 3 đĩa từ A sang B, C trung gian.
Thứ tự dời đĩa: A->B, A->C, B->C, A->B, C->A, C->B, A->B
B0: Cất (3,A,B,C)
B1: Trong khi stack khác rỗng, lặp lại các bước sau:
B1.1: lấy dl từ stack
B1.2: nếu 1 đĩa thì xuất, ngược lại cất dl theo thứ tự: phải, giữa, trái
Bài 7. Viết hàm tính chuỗi biểu thức chỉ bao gồm: các dấu mở ngoặc/đóng ngoặc; 4 toán
tử cộng, trừ, nhân và chia (+, -, *, /); các toán hạng đều chỉ là các con số nguyên từ 0 đến 9;
không có bất kỳ khoảng trắng nào giữa các ký tự.
HD:
Các toán tử được đặt giữa hai toán hạng gọi là biểu thức trung tố (infix), nếu đặt sau các
toán hạng gọi là biểu thức hậu tố (postfix). Biểu thức hậu tố không cần ngoặc và máy tính
dễ dàng tính được giá trị của biểu thức hậu tố.
* Thuật toán tính giá trị biểu thức hậu tố:
Đọc biểu thức từ trái sang phải, nếu gặp một toán hạng (con số hoặc biến) thì push toán
hạng này vào ngăn xếp; nếu gặp toán tử, lấy hai toán hạng ra khỏi ngăn xếp (stack), tính kết
quả, đẩy kết quả trở lại ngăn xếp. Khi quá trình kết thúc thì con số cuối cùng còn lại trong
ngăn xếp chính là giá trị của biểu thức đó.
Ví dụ: biểu thức trung tố :
5 + ((1 + 2) * 4) + 3
được biểu diễn lại dưới dạng hậu tố là (ta sẽ bàn về thuật toán chuyển đổi từ trung tố sang
hậu tố sau):
5 1 2 + 4 * + 3 +
Quá trình tính toán sẽ diễn ra theo như bảng dưới đây:
Ký tự Thao tác Trạng thái stack
(1,A,B,C)(1,A,C,B)(2,A,C,B)(1,B,C,A)(1,C,A,B)(1,A,B,C)(1,A,B,C)(1,C,B,A)
(3,A,B,C)(2,C,B,A)(2,C,B,A)(1,A,B,C)RỖNG
4
(3,A,B,C)
(2,A,C,B) (2,C,B,A)(1,A,B,C)
(1,A,B,C) (1,A,C,B) (1,B,C,A) (1,C,A,B) (1,C,B,A) (1,A,B,C)
5 Push 5 5
1 Push 1 5, 1
2 Push 2 5, 1, 2
+ Tính 1 + 2
Push 3
5, 3
4 Push 4 5, 3, 4
* Tính 3 * 4
Push 12
5, 12
+ Tính 12 + 5
Push 17
17
3 Push 3 17, 3
+ Tính 17 + 3
Push 20
20
* Thuật toán chuyển đổi biểu thức trung tố sang hậu tố
Duyệt biểu thức từ trái sang phải:
+ Nếu gặp một toán hạng (con số hoặc biến) thì ghi nó vào chuỗi kết quả (chuỗi kết quả là
biểu thức hậu tố).
+ Nếu gặp dấu mở ngoặc, đưa nó vào stack.
+ Nếu gặp một toán tử (gọi là o1 ), thực hiện hai bước sau:
- Chừng nào còn có một toán tử o2 ở đỉnh ngăn xếp và độ ưu tiên của o1 nhỏ hơn hay
bằng độ ưu tiên của o2 thì lấy o2 ra khỏi ngăn xếp và ghi vào kết quả (ngoặc trái có độ ưu
tiên thấp nhất).
- Push o1 vào ngăn xếp
+ Nếu gặp dấu đóng ngoặc thì cứ lấy các toán tử trong ngăn xếp ra và ghi vào kết quả cho
đến khi lấy được dấu mở ngoặc ra khỏi ngăn xếp.
+ Khi đã duyệt hết biểu thức trung tố, lần lượt lấy tất cả toán hạng (nếu có) từ ngăn xếp ra
và ghi vào chuỗi kết quả.
ví dụ : Biểu thức cần chuyển đổi: 3+4*2/(1-5)
Ký tự Thao tác Stack Chuỗi hậu tố
3 Ghi 3 vào k.quả 3
+ Push + +
4 Ghi 4 vào k.quả 3 4
* Push * + *
2 Ghi 2 vào kquả 3 4 2
/ Lấy * ra khỏi stack, ghi vào k.quả, push / + / 3 4 2 *
( Push ( + / ( 3 4 2 *
1 Ghi 1 vào k.quả + / ( 3 4 2 * 1
- Push - + / ( - 3 4 2 * 1
5 Ghi 5 vào k.quả + / ( - 3 4 2 * 1 5
) Pop cho đến khi lấy được (, ghi các toán
tử pop được ra k.quả
+ / 3 4 2 * 1 5 -
Pop tất cả các toán tử ra khỏi ngăn xếp và
ghi vào kết quả
3 4 2 * 1 5 – / +
5
Thuật toán được trình bày ở đây là khá đơn giản và chưa ứng dụng được trong trường hợp
biểu thức có các hàm như sin, cos,… hoặc có các biến. Tuy nhiên, việc mở rộng thuật toán
là hoàn toàn có thể.
Bài 8. G/s chương trình cần sử dụng nhiều stack, nếu sử dụng nhiều cấu trúc stack riêng lẻ
thì sẽ không tận dụng được bộ nhớ của nhau. Ví dụ stack 1 còn nhiều bộ nhớ, stack 2 hết bộ
nhớ, nhưng lại không thể sử dụng bộ nhớ của stack 1. Để giải quyết vấn đề, hãy xây dựng
các cấu trúc sau:
a) Xây dựng cấu trúc có 2 stack và các phép toán cơ bản trên cấu trúc này
b) Xây dựng cấu trúc có n stack và các phép toán cơ bản trên cấu trúc này
HD:
a) 2 stack: Để hai stack ở hai đầu, hướng phát triển ngược nhau, đáy stack cố định
b) n stack (n>2): ban đầu chia đều bộ nhớ cho n stack. Nếu có một stack hết chỗ thì đẩy
stack sau sang phải hoặc dời chính stack đó sang trái, khi đó đáy stack di chuyển.
V. DANH SÁCH LIÊN KẾT
Bài 1. Viết chương trình tạo một menu thực hiện các công việc sau:
a. Nhập danh sách liên kết theo giải thuật thêm về cuối danh sách, mỗi phần tử gồm có các
thông tin sau: mã sinh viên(int), và họ tên sinh viên (char[30])
b. Liệt kê danh sách ra màn hình
c. Cho biết tổng số nút trong danh sách liên kết.
d. Thêm 1 phần tử vào sau phần tử có thứ tự thứ i trong danh sách.
e. In ra họ tên của sinh viên có mã do ta nhập vào.
f. Loại bỏ nút có mã do ta nhập vào, trước khi xóa hỏi lại "Bạn có muốn xóa (Y/N)?"
g. Sắp xếp lại danh sách theo thứ tự mã số giảm dần
h. Ghi toàn bộ danh sách vào file tên "DSSV.DAT"
i. Nạp danh sách từ file "DSSV.DAT" vào danh sách liên kết. Nếu trong danh sách liên kết
đã có nút thì xóa tất cả dữ liệu hiện có trong danh sách liên kết trước khi đưa dữ liệu từ
file vào.
Bài 2. Viết chương trình tạo một danh sách liên kết theo giải thuật thêm vào đầu danh
sách, mỗi nút chứa một số nguyên.
Bài 3. Viết hàm xóa một nút có địa chỉ p.
Bài 4. Viết hàm copy_list trên danh sách liên kết để tạo ra một danh sách liên kết mới
gống danh sách liên kết cũ.
31597826
đáy stack 1 đỉnh stack 1 đỉnh stack 2 đáy stack 2
428317596
đáy stack 1 đỉnh stack 1 đáy stack 2 đỉnh stack 2 đáy stack 3 đỉnh stack 3
6
Bài 5. Ghép một danh sách liên kết có địa chỉ đầu là First vào một danh sách liên kết có
địa chỉ đầu là First1 ngay sau phần tử thứ I trong danh sách liên kết first1.
Bài 6. Viết hàm lọc danh sách liên kết để tránh trường hợp các nút trong danh sách liên kết
bị trùng info
Bài 7. Đảo ngược vùng liên kết của một danh sách liên kết sao cho:
- First sẽ chỉ đến phần tử cuối
- Phần tử đầu có liên kết là NULL
Bài 8. Viết hàm Left_Traverse(NODE first) để duyện ngược danh sách liên kết.
Bài 9. Viết giải thuật tách một danh sách liên kết thành hai danh sách liên kết, trong đó
một danh sách liên kết của phần tử có số thứ tự lẽ và một danh sách liên kết chứa các phần
tử có số thứ tự chẵn trong danh sách liên kết cũ.
Bài 10. Tạo một danh sách liên kết chứa tên học viên, điểm trung bình, hạng của học viên
(với điều kiện chỉ nhập tên và điểm trung bình). Quá trình nhập sẽ dừng lại khi tên nhập vào
là rỗng.
Xếp hạng cho các học viên. In ra danh sách học viên thứ tự hạng tăng dần(Ghi chú: Cùng
điểm trung bình thì cùng hạng).
Bài 11. Nhập hai đa thức theo danh sách liên kết. In ra tích của hai đa thức này.
Ví dụ: Đa thức First1: 2x5
+4x2
-1
Đa thức First1: 10x7
-3x4
+3x2
Kết quả in ra là 20x12
+34x9
-8x7
-12x6
+7x4
-x2
Bài 12. Viết giải thuật thêm phần tử có nội dung x vào danh sách liên kết có thứ tự tăng dần
sao cho sau khi them danh sách liên kết vẫn có thứ tự tăng dần.
Bài 13. Cài đặt cấu trúc dslk đơn có nút head và các hàm xử lý cơ bản
Bài 14. Cài đặt cấu trúc dslk đơn có vòng và các hàm xử lý cơ bản
Bài 15. Cài đặt cấu trúc dslk đơn có nút head+vòng và các hàm xử lý cơ bản
Bài 16. Cài đặt cấu trúc stack bằng dslk đơn và các hàm xử lý cơ bản trên satck
Bài 17. Cài đặt cấu trúc queue bằng dslk đơn và các hàm xử lý cơ bản trên queue.
Bài 18. Dùng dslk đơn lưu trữ đa thức P(x) = anxn
+ an-1xn-1
+ …+ a1x1
+ a0x0
. Biết rằng mỗi
nút chứa dữ liệu là hệ số và số mũ của một số hạng.
a) Viết hàm tính giá trị đa thức khi biết x.
b) Viết hàm cộng, trừ, nhân, chia hai đa thức.
c) Viết hàm tính đạo hàm, tích phân một đa thức.
Hướng dẫn:
23 -12 50P
NULL
12 51 -40Q
NULL
23 51 10R
NULL
p
r
q
7
P(x)= 2x3
–x2
+5
Q(x)= x2
+5x-4
R(x)=P(x)+Q(x)=2x3
+5x+1
+ Sắp xếp dslk P, Q theo số mũ giảm dần
+ Cộng dồn những nút có cùng số mũ trên P (Q), bỏ những nút có hệ số = 0
+ Dùng 2 biến p,q trỏ tới nút đang xét trên P,Q và biến r trỏ tới nút cuối của R.
Khởi đầu p=P, q=Q, R = r = NULL
- Nếu mũ p> mũ q thì chép nút p vào R, tăng p, tăng r
- Nếu mũ p< mũ q thì chép nút q vào R, tăng q, tăng r
- Nếu mũ p= mũ q thì cộng hs p và hs q. Nếu tổng khác 0 thì tạo nút tổng gắn vào R,
tăng p,q, r. tổng bằng =0 thì chỉ tăng p,q.
Lặp lại việc so sánh số mũ, cho tới khi p=NULL hoặc q=NULL. Sau đó chép các nút còn lại
của P hoặc Q vào R
Bài 19. Dùng dslk đơn có nút head để lưu trữ một tập hợp các số nguyên.
a) Viết hàm xét một phần tử có thuộc tập hợp hay không?
b) Viết các hàm tìm giao, hợp, hiệu hai tập hợp.
c) Viết hàm xét một tập có là một tập con của một tập cho trước hay không?
HD:
A={2,5}lưu trữ dạng sau:
Bài 20. Có thể dùng một mảng để cài đặt nhiều cấu trúc danh sách liên kết: Mỗi phần tử của
mảng là một nút gồm hai thành phần (data,next), next là chỉ số của phần tử tiếp
theo, nếu next=-1 thì đó là phần tử cuối của một ds. Hãy cài đặt các phép toán cơ
bản trên dslk loại này.
Ví dụ: giả sử dùng mảng 10 phần tử và có 3 ds: list 1, list 2, và ds các nút trống (empty)
2 5A
NULL
HEAD
list2 list1
012345678942-1956788-12912-141
empty
67list2
=3
12 95
3 7 2
8-1
5
29list1
=6
41 2-1
6 9 1
4empty
=0
8 -1
0 4 8
8
Bài 21. Ban đầu ds empty là 10 nút, nút đầu là nút 0, nút kế là nút 1,…, nút cuối là nút 9.
Nút được chọn để cấp phát là nút đầu ds empty, khi hủy một nút thì thêm nút đó vào đầu ds
empty.
Bài 22. Viết chương trình chọn phò mã theo giải thuật Josephus: Cho n hoàng tử xếp hàng
ngang, đánh số các hoàng tử từ 1->n, loại hoàng tử cách hoàng tử đầu hàng k vị trí (k là một
số ngẫu nhiên được chọn trước), nếu k lớn hơn số hoàng tử còn lại thì đếm vòng lên đầu.
Lặp lại việc loại cho đến khi chỉ còn 1 hoàng tử và đó là phò mã.
Hướng dẫn:
Dùng dslk vòng, hủy phần tử thứ k, cho đến khi ds chỉ còn 1 phần tử.
Ví dụ: có 5 hoàng tử, k=3
xếp hàng và đánh số: 1 2 3 4 5
loại 4: 1 2 3 5
loai 5: 1 2 3
loại 1: 2 3
loại 3: 2
2 là phò mã
Bài 23. Viết chương trình tự điển Anh-Việt có các chức năng sau:
a) Nhập, xem, xoá, sửa từ
b) Tra từ: nhập tiếng Anh hiện nghĩa tiếng Việt.
c) Hiện toàn bộ tự điển theo thứ tự Alphabet
Yêu cầu là tự điển lưu trữ theo cấu trúc sau:
Hướng dẫn:
Tự điển lưu trữ bằng 26 dslk đơn, dslk thứ 0 lưu trữ vần a,…, slk thứ 25 lưu trữ vần z. Mỗi
ds luôn có thứ tự theo Alphabet.
Bài 24. Xét ma trận thưa, trong ma trận chỉ có một số ít phần tử khác không. Để tiết kiệm
bộ nhớ khi lưu trữ ma trận này, ta có thể tổ chức như sau:
0 1 2 3 4
0
0 0 0 5 9
1
0 0 0 0 0
2
0 0 8 0 0
3
0 0 0 0 0
4
0 2 0 4 0
Dslk thứ 0 có phần tử (3,5) nghĩa là: hàng 0, cột 3 có số 5
Viết hàm cộng, trừ, nhân hai ma trận theo cách lưu trữ này.
012…25 amột andvà
beecon ong bookquyển sách
zoosở thú
01234 3,5 4,9
2,8
1,2 3,4
9
Bài 25. Viết chương trình quản lý, điều hành tuyến xa lửa, dùng dslk kép+head+vòng.
Chương trình có các chức năng sau:
a) Thêm, xem, hiệu chỉnh, hủy một đoạn đường sắt. Đoạn đường sắt có thông tin là: ga đầu,
ga cuối, chiều dài đoạn đường, thời gian xe lửa chạy trên đoạn đường đó.
b) Xem toàn tuyến đường sắt đi xuôi, tuyến đường sắt đi ngược. Tuyến đường sắt gồm
nhiều đoạn đường sắt.
c) Xem một lộ trình: nhập nơi đi, nơi đến, cho biết các ga trung gian, tổng chiều dài, tổng
thời gian của lộ trình.
Bài 26. Viết hàm cộng, trừ, nhân, chia hai số nguyên lớn bất kỳ theo cách lưu trữ sau: ví dụ
A = 8.041.009.000.105
chia thành 5 nhóm, mỗi nhóm 3 chữ số, lưu trữ vào một nút của dslk kép+head+vòng
Bài 27. Viết chương trình xử lý đơn khiếu nại. Đơn khiếu nại nào có độ ưu tiên cao hơn sẽ
được giải quyết trước. Nếu các đơn có độ ưu tiên bằng nhau thì đơn nào đến trước sẽ được
giải quyết trước. Chương trình có các chức năng sau:
a. Nhận đơn: nhập tên đơn, độ ưu tiên, thông báo nếu đầy đơn (không nhận đơn nữa).
b. Giải quyết đơn: in ra màn hình tên đơn phải giải quyết, thông báo nếu hết đơn.
c. Xem các đơn: in ra màn hình các đơn cần xử lý theo thứ tự ưu tiên.
Bài 28. Trong dslk đơn chuẩn
a) Viết hàm chèn vào trước một nút khác (chèn dữ liệu x vào trước nút có đ/c là q)
b) Viết hàm hủy nút p.
c) Viết hàm hủy những nút trùng dữ liệu (nhưng nút trùng dữ liệu chỉ giữ lại một nút)
HD: a) chèn sau rồi hoán vị. b) hoán vị p và nút sau p, sau đó hủy sau p.
Bài 29. Trong dslk đơn chuẩn
a) Viết hàm tìm địa chỉ của nút thứ i trong ds (i=0,1,…)
b) Viết hàm tìm vị trí của nút có đ/c biết trước trong ds (vị trí tính từ 0)
c) Viết hàm tìm đ/c của nút ngay trước nút p
d) Viết hàm đếm số nút trong ds
VI. CÂY NHỊ PHÂN
Bài 1. Cây nhị phân cân bằng hoàn toàn là cây nhị phân mà tương ứng với tất cả các nút
thì số nút của cây con bên trái và số nút của cây con bên phải chênh lệch nhau không quá 1.
Cho cây nhị phân tìm kiếm có con trỏ đầu tree chỉ đến gốc của cây với khai báo như sau:
struct node {
int key;
int info ;
struct node *left;
head 8 41 9A 0 105
10
struct node *right;
} ;
typedef struct node *PTR;
PTR tree;
a. Hãy viết chương trình con xác định xem cây nhị phân tree có phải là cây nhị phân tìm
kiếm cân bằng hoàn toàn hay không?
b. Hãy viết hàm trả về mức của nút có khóa key = X, với X là số nguyên dương và giả sử
rằng nút gốc có mức bằng 1. Ghi chú là trong trường hợp cây tree không có nút với
khóa X thì hàm sẽ trả về 0.
Bài 2. Trên cây nhị phân tìm kiếm (BST) với dữ liệu ở các nút là số nguyên, hãy viết các
hàm sau:
a) Đếm số nút và số nút lá trên cây.
b) Tìm so lớn nhất, so nho nhat trên cây, tính giá trị trung bình của các so trên cây.
c) Tính chiều cao của cây.
d) Kiểm tra cây nhị phân có phải cây AVL không?
Bài 3. Viết chương trình tạo một menu thực hiện các mục sau:
a. Tạo cây nhị phân tìm kiếm với nội dung là số nguyên(không trùng nhau)
b. Liệt kê cây nhị phân ra màn hình theo thứ tự NLR
c. Đếm tổng số nút, số nút lá, và số nút trung gian của cây.
d. Tính độ cao của cây.
e. Loại bỏ nút có nội dung là x trong cây nhị phân BST.
f. Thêm nút có nội dung x vào cây nhị phân BST sao cho sau khi thêm thì cây vẫn là
BST.
g. Vẽ cây nhị phân ra màn hình.
Bài 4. Cho một cây nhị phân tree, hãy viết chương trình để sao chép nó thành cây mới
tree2, với khóa, nội dung, và liên kết giống như cây tree.
Bài 5. Viết các hàm kiểm tra xem cây nhị phân
a. Có phải là cây nhị phân đúng không.
b. Có phải là cây nhị phân đầy không.
Bài 6. Viết hàm kiểm tra nút x và y có trên cây hay không, nếu có cả x và y trên cây thì
xác định nút gốc của cây con nhỏ nhất có chứa x và y.
Bài 7. Hãy trình bày cách chuyển một biểu thức số học sang cây biểu thức. Vẽ cây biểu
thức của biểu thức số học sau:
(10+5)^2/(52*4-3)
Bài 8. Cho một cây biểu thức, hãy viết hàm Calculate(NODE root) để tính giá trị của cây
biểu thức đó biết rằng các toán tử được dùng trong biểu là: + - * / ^ % !
Bài 9. Chứng minh:
11
a/ Nếu số nút của cây nhị phân gần đầy là lẻ thì cây này cũng là cây nhị phân đúng. Nếu số
nút của cây nhị phân gần đầy là chẵn thì cây này không là cây nhị phân đúng.
b/ Nếu cây nhị phân đúng có n nút lá thì sẽ có 2n-1 nút.
c/ Nếu cây nhị phân không đúng và gần đầy có n nút lá thì sẽ có 2n nút.
Bài 10. Cài đặt các cách duyệt cây NLR, LNR, LRN không sử dụng kỹ thuật đệ qui.
HD:
* Duyệt NLR:
+ Cắt gốc vào stack
+ Trong khi stack còn khác rỗng thi thực hiện các lệnh sau:
- Lấy p ở đỉnh stack, in p->data
- Nếu p có con phải/trái thì cắt con phải/trái vào stack
* Duyệt LNR:
+ p=root
+ Trong khi p còn khác NULL thì cắt p vào stack và gán p=p->left
+ Trong khi stack còn khác rỗng thực hiện các lệnh sau:
- lay p tu dinh stack, in p->data,
- neu p co con phai thi goi q la con phai va trong khi q con khac NULL thi cat q vao stack
va gan q=q->left
* Duyet LRN:
55
20 32 65
35 35 35
*
60
*
30
*
30
*
30
*
80
70 70 70 70
*
50 50 50 50
// mot nut khi cat cac nut con vao stack thi gan flag=1 de tb cac con trai/phai cua no da duoc
duyet
+ ban dau gan tat cac nut co flag=0,
2032553030356065505050707
08020,30,32,35,50,55,60,65,70
,80
50
30 70
60 80
55 65
35
32
20
12
+ cat root vao stack
+ trong khi stack con khac rong thuc hien cac buoc sau :
- goi p la phan tu dinh stack
- neu p khong co con hoac co cua p=1 thi lay p ra khoi stack, xuat p->data
nguoc lai cat con phai va/hoac con trai neu co cua p vao stack va gan co cua p=1
Bài 11. Cây nhị phân đầy hoặc gần đầy có thể cài đặt bằng mảng: mỗi nút là một phần tử
của mảng, nút gốc lưu ở phần tử 0 của mảng, nếu nút cha lưu ở phần tử thứ i của mảng thì
nút con bên trái lưu ở phần tử 2i+1 và nút con bên phải lưu ở phần tử 2i+2. Với cây nhị
phân bất kỳ, có thể thêm vào các nút gỉa để chuyển về cây gần đầy (nút gỉa có thể gây lãng
phí bộ nhớ). Hãy viết các hàm cơ bản trên cấu trúc cây cài đặt bằng mảng như trên.
Hướng dẫn:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
50 30 70 60 80 55 65
Bài 12. Cài đặt cây cân bằng AVL (Adelson Velski &Landis) với các hàm cơ bản
Bài 13. Viết hàm tạo cây, duyệt cây nhị phân tìm kiếm theo chiều rộng
HD:
Cây nhị phân tìm kiếm là cây mà mỗi nút có tối đa hai con, trong đó con trái nhỏ hơn nút,s
con phải lớn hơn nút.
- Khai báo cấu trúc một nút
struct node
{ int data;
node * left,*right;
};
node *root;//dc goc cay
- Nhập cây: nút nhỏ bên trái, nút lớn bên phải
- In Cây: dùng queue
B1: cất root vào queue
B2: trong khi queue còn khác rỗng thực hiện các bước sau:
50
30 70
604020 80
0
1 2
3 4 5 6
50
30 70
60 80
55 65
50
30 70
60 80
0
1 2
3 4 5 6
55 657 8 9 10 11 12
13
0 1 2 3 4 5 6
50 30 70 20 40 60 80
B2.1: Lấy node trong queue và in data của node
B2.2: Cất con trái, con phải nếu có của node vào queue
- Cất 5
- Lấy 5, in 5
- Cất con của 5 là 2, 9 vào queue
- Lấy 2, in 2
- Cất con của 2 là 1, 3 vào queue
- Lấy 9, in 9
- Cất con của 9 là 6, 12 vào queue
- Lấy 1, in 1, 1 không có con nên không cất con của 1
- vv…
Bài 14. Trên cây nhị phân tìm kiếm (BST) với dữ liệu ở các nút là số nguyên, hãy viết các
hàm sau:
a) Đếm số nút và số nút lá trên cây.
b) Tìm so lớn nhất, so nho nhat trên cây, tính giá trị trung bình của các so trên cây.
c) Tính chiều cao của cây.
d) Duyệt cây theo mức từ mức thấp đến mức cao, mỗi mức duyệt từ trái qua phải.
e) In cây ở dạng hình cây.
f) Xoay cây: tại mỗi nút có cây con trái thành cây con phải và ngược lại
VII. ĐỒ THỊ
Bài 1. Cho đồ thị vô hướng được lưu trữ trong file văn bản dothi.in theo khuôn dạng sau:
- Dòng đầu tiên ghi số đỉnh của đồ thị
- Mỗi dòng kế tiếp ghi hai đỉnh của một cạnh đồ thị, hai đỉnh được ghi cách nhau một hoặc
vài ký tự trống.
Viết chương trình kiểm tra tính liên thông của đồ thị, kết quả được ghi trong file văn bản
ketqua.out theo khuôn dạng như sau:
- Dòng thứ nhất ghi : đồ thị liên thông hoặc đồ thị không liên thông
- Nếu đồ thị không liên thông thì mỗi dòng tiếp theo ghi các đỉnh của một thành phần liên
thông.
Bài 2. Cho đồ thị vô hướng G có n đỉnh với các đỉnh được đánh số từ 1 đến n theo cấu trúc
ma trận kề sau đây:
const MAX = 50; // Số đỉnh tối đa của đồ thị
typedef int Dothi[MAX][MAX] ;
Dothi G ;
0123456752991313612361261212Kết quả in ra: 5,
2, 9, 1, 3, 6, 12
14
int n; // số đỉnh của đồ thị G
Hãy viết chương trình con để xác định đồ thị G có đường đi từ đỉnh u đến đỉnh v hay
không?
Bài 3. Cho đồ thị vô hướng G được biểu diễn dưới dạng danh sách kề trong file dske.in
theo khuôn dạng:
• Dòng đầu tiên ghi lại số tự nhiên N là số đỉnh của đồ thị.
• N dòng kế tiếp mỗi dòng ghi lại danh sách kề của đỉnh tương ứng, hai đỉnh trong cùng
một danh sách kề được ghi cách nhau một hoặc vài kí tự trống, đỉnh không có cạnh nối với
nó (đỉnh cô lập) được ghi giá trị 0 hoặc là dòng trống.
Hãy viết chương trình thực hiện việc kiểm tra và đưa ra thông báo tính liên thông của G như
sau. Nếu G không liên thông thì thông báo ”G không liên thông”. Nếu G liên thông thì
kiểm tra tiếp xem G có chu trình Euler hay không, nếu có thì thông báo “G là đồ thị Euler”.
Nếu G không có chu trình Euler thì kiểm tra tiếp xem G có đường đi Euler hay không, nếu
có thì thông báo “G là đồ thị nửa Euler”, ngược lại thông báo “G không là đồ thị nửa-
Euler”. Ví dụ với đồ thị 4 đỉnh được cho trong file dske.in dưới đây sẽ cho ta kết quả “G là
đồ thị Euler”.
dske.in
4
2 3
1 4
1 4
3 2
Bài 4. Cho đồ thị vô hướng G =<V,E> gồm N đỉnh và M cạnh được biểu diễn dưới dạng
danh sách kề trong file dske.in theo khuôn dạng sau:
• Dòng đầu tiên ghi lại số tự nhiên N là số đỉnh của đồ thị;
• N dòng kế tiếp, mỗi dòng thứ i (i=1,…,N) ghi lại danh sách các đỉnh kề với đỉnh thứ
i. Hai đỉnh trong cùng một danh sách kề được phân biệt với nhau bằng một hoặc vài
kí tự trống. Dòng thứ i sẽ ghi số 0 nếu đỉnh i không có đỉnh kề.
Hãy viết chương trình chuyển đổi biểu diễn đồ thị G dưới dạng danh sách kề như trên thành
biểu diễn của đồ thị G dưới dạng ma trận kề và danh sách cạnh. Khuôn dạng biểu diễn đồ
thị G dưới dạng ma trận kề, danh sách kề được ghi lại trong file mtke.out và dscanh.out theo
khuôn dạng sau:
+ Khuôn dạng file mtke.out:
• Dòng đầu tiên ghi lại số tự nhiên N là số đỉnh của đồ thị;
• N dòng kế tiếp ghi lại ma trận kề của đồ thị, hai phần tử khác nhau của ma trận kề
được ghi cách nhau bởi một vài ký tự trống.
+ Khuôn dạng file dscanh.out:
• Dòng đầu tiên ghi lại số tự nhiên N và M tương ứng với số đỉnh và số cạnh của đồ
thị, hai số được ghi cách nhau bởi một vài ký tự trống;
15
• M dòng kế tiếp mỗi dòng ghi lại một cạnh của đồ thị, đỉnh đầu và đỉnh cuối của
mỗi cạnh được ghi cách nhau bởi một vài ký tự trống.
Ví dụ đồ thị gồm 5 đỉnh, 5 cạnh được biểu diễn trong file dske.in như dưới đây sẽ cho ta các
file mtke.out và dscanh.out tương ứng.
dske.in mtke.out
dscanh.out
5 5 5
4
2 3 0 1 1 0 0 1
2
1 4 1 0 0 1 0 1
3
1 5 1 0 0 0 1 2
4
2 0 1 0 0 0 3
5
3 0 0 1 0 0
Chú ý: làm bài tập tương tự cho đồ thị có hướng.
Bài 5. Cho đồ thị có hướng được lưu trữ trong file văn bản duongdi.in theo khuôn dạng
sau:
- Dòng đầu tiên ghi số đỉnh và đỉnh xuất phát s.
- Mỗi dòng kế tiếp ghi đỉnh đầu, đỉnh cuối và trọng số của một cung.
Viết chương trình tìm đuờng đi ngắn nhất từ đỉnh s đến tất cả các đỉnh còn lại, kết quả được
ghi trong file văn bản duongdi.out, mỗi dòng ghi một đường đi.
ví dụ:
file duongdi.in
6 1
1 2 1
2 3 5
2 4 2
2 6 7
3 6 1
4 3 1
4 1 2
4 5 4
5 4 3
6 5 1
file duongdi.out
Duong di tu 1 den 2 la:1->2
Duong di tu 1 den 3 la:1->2->4->3
Duong di tu 1 den 4 la:1->2->4
Duong di tu 1 den 5 la:1->2->4->3->6->5
Duong di tu 1 den 6 la:1->2->4->3->6
16
VIII.SẮP XẾP VÀ TÌM KIẾM
17
IX. MỘT SỐ BÀI TOÁN CĂN BẢN
Bài 1. Giả sử bảng điểm có dạng sau.
Mã sinh viên Môn 1 Môn 2 Môn 3
sv1 6 9 7
sv2 5 2 8
vv…
1/ Hãy xây dựng giải thuật nhập điểm của n sinh viên và giải thuật in bảng điểm trong hai
trường hợp sau:
a) Dùng CTDL để lưu trữ bảng điểm là mảng 1 chiều: điểm của sv1 lưu vào 3 vị trí đầu
mảng, 3 vị trí tiếp theo lưu điểm của sv2, vv…
b) Dùng CTDL để lưu trữ bảng điểm là mảng 2 chiều (n hàng, 3 cột): hàng i lưu điểm sv thứ
i, cột j lưu điểm môn j.
2/ Cho nhận xét về hai CTDL trên
Bài 2. Xây dựng giải thuật và đánh giá giải thuật đoán số như sau: người sử dụng nghĩ một
số từ 1 đến 100, máy sẽ đoán tối đa 7 lần sẽ đoán trúng.
Bài 3. Xét hệ phương trình tuyến tính có dạng
a11x1 = b1
a21x1 + a22x2 = b2
an1xn + an2x2 +…+ annxn = bn
(aij khac 0)
Để tiết kiệm bộ nhớ ta chỉ lưu trữ các hệ số của ma trận bằng mảng 1 chiều. Viết chương
trình giải hệ phương trình này với cách lưu trữ như trên.
Bài 4. Xét đa thức p(x)= anxn
+ an-1xn-1
+…+ a0.
1/ Nếu lưu trữ đa thức bằng một mảng một chiều theo dạng (n, an, an-1,…, a0) thì có ưu
nhược điểm gì?
2/ Hãy đề xuất một cách lưu trữ khác mà theo bạn là tốt hơn.
3/ Viết chương trình cộng, trừ, nhân, chia hai đa thức với cách lưu trữ như câu 2.
Bài 5. Viết chương trình giải hệ phương trình tuyến tính (n phương trình, n ẩn số) và đánh
giá độ phức tạp của chương trình.
Bài 6. Cho dãy an như sau:
a0 =1; a1=0; a2 =-1;
an = 2an-1 – 3an-2 - an-3 (n>2)
Viết chương trình tính số hạng thứ n của dãy bằng hai cách:
a) Sử dụng kỹ thuật đệ qui.
b) Không sử dụng kỹ thuật đệ qui.
18
Bài 7. Liệt kê các cách xếp n con hậu vào bàn cờ kích thứơc n x n sao cho không ăn lẫn
nhau.
Bài 8. Cho dãy gồm n số, tìm các dãy con có tổng bằng m.
Bài 9. Cho dãy gồm n số, tìm các dãy con có k phần tử và có tổng bằng m.
Bài 10. Tam giác thần bí bậc n là tam giác vuông cân, mỗi cạnh có n phần tử là các số tự
nhiên từ 1 đến 3n-3 và không trùng nhau, thoả tính chất tổng các phần tử trên mỗi cạnh
đều có cùng giá trị .
ví dụ :đây là một tam giác thần bí bậc n=5 vì có tổng các phần tử trên mỗi cạnh bằng nhau
(bằng 35).
12
11 2
6 4
1 7
5 9 8 3 10
a) Viết hàm kiểm tra một tam giác vuông cân với các phần tử là các số tự nhiên từ 1 đến
3n-3 có là tam giác thần bí bậc n hay không? nếu là tam giác thần bí trả về 1 ngược lại trả
về 0. Biết rằng để tiết kiệm bộ nhớ, tam gíac được lưu trong mảng 1 chiều. Ví dụ tam gíac
như trên lưu trữ như sau: 12 11 6 1 5 9 8 3 10 7 4 2
b) Viết hàm liệt kê tất cả các tam giác thần bí bậc n.
Bài 11. Hình vuông thần bí bậc n là một ma trận kích thước n x n, gồm các phần tử từ 1 đến
n2
không trùng nhau, sao cho tổng mỗi dòng, mỗi cột, mỗi đường chéo đều bằng nhau. Ví
dụ một hình vuông thần bí bậc 3 là:
2 7 6
9 5 1
4 3 8
Viết chương trình liệt kê tất cả các hình vuông thần bí bậc n.
Bài 12. Liệt kê tất cả các cách ghi N thành tổng các số nguyên dương. Ví dụ N=5, tách N
thành 1 số, 2 số, 3 số, 4 số, 5 số như sau: 5, 1+4, 2+3, 1+1+3, 1+2+2, 1+1+1+2, 1+1+1+1+1
Bài 13. Cho dãy n số nguyên và một số k, xuất ra tất cả các dãy con giảm có k phần tử (dãy
con có thể liên tiếp hoặc không liên tiếp và có thể có phần tử trùng).
Ví dụ: dãy 5 2 4 3 1 có các dãy con 3 phần tử và giảm là: 5 2 1; 5 4 3; 5 4 1; 5 3 1; 4 3 1
Bài 14. Cho dãy n số nguyên, xuất ra dãy con tăng dài nhất (dãy con có thể liên tiếp hoặc
không liên tiếp và có thể có phần tử trùng). Nếu có nhiều dãy con tăng dài bằng nhau thì chỉ
xuất ra một dãy.
Ví dụ: dãy 7, 3, 2, 4, 1, 6, 5, 8 có dãy con tăng dài nhất là: 3, 4, 6, 8 có chiều dài là 4
Bài 15. Tìm tất cả các nghiệm nguyên không âm của phương trình sau:
a1x1 +a2x2 +…anxn = b (ai duong, bi la các số nguyên không âm)
Ví dụ:
phương trình: x1+2x2+3x3=20 (n=3,b=20, a1=1, a2=2, a3=3)
19
có 44 nghiệm là: x=(0,1,6),.., x=(2,2,4),...,x=(20,0,0)
X. BÀI TẬP CÓ BÀI GIẢI
Bài 1. Chứng tỏ rằng chương trình sử dụng các lệnh if, if..else, switch, for, while, do..
while đều có thể chuyển đổi thành chương trình chỉ sử dụng lệnh while.
Bài 2. Hãy chuyển đổi chương trình sau đây thành chương trình chỉ sử dụng lệnh while và
hãy cho biết kết quả sau khi chương trình thực hiện:
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main(void)
{
clrscr();
int n, m=0, k=0;n = strlen(str);char s[32];
for(int i=0; i<=n; i++){
switch(str[i]){
case ' ' :
case 't':
case 'n':
case 'r':
case '0':
if (k>0) {
s[k]='0';m++;k=0;
printf("n Kết quả bước %d:%s",m,s);
}
break;
default:
s[k++]=str[i]; break;
}
}
}
Bài giải: 3
Bài 3. Viết chương trình tìm giá trị tối ưu fopt = f(x1,x2,..,xn) và phương án tối ưu xopt =
(x1, x2,..,xn) của hàm mục tiêu ∑=
=
n
i
iin xcxxxf
1
21 ;),..,,( Trong đó
( ) ( ) { }






∈≤=∈ ∑=
n
i
jiinn xbxaxxxDxxx
1
2121 ;1,0;:,..,,,..,, ; cj, aj, b là các số nguyên dương
(j=1,2,..,n).
Dữ liệu vào n, b, cj, aj được cho trong file Data.in theo khuôn dạng sau:
• Dòng đầu tiên ghi lại hai số tự nhiên n và b, hai số được viết cách nhau bởi một hoặc
vài kí tự trống.
20
• Dòng kế tiếp ghi lại n số nguyên dương c1, c2, .., cn. ; các số được viết cách nhau bởi
một hoặc vài kí tự trống.
• Dòng cuối cùng ghi lại n số nguyên dương a1, a2,..,an; các số được viết cách nhau bởi
một hoặc vài kí tự trống.
Giá trị tối ưu và phương án tối ưu tìm được ghi lại trong file Ketqua.out theo khuôn dạng
sau:
• Dòng đầu tiên ghi lại giá trị tối ưu fopt = f(x1,x2,..,xn) của hàm mục tiêu.
• Dòng kế tiếp ghi lại n thành phần của phương án tối ưu xopt = (x1, x2,..,xn). Mỗi thành
phần được viết cách nhau một vài kí tự trống.
Ví dụ dưới đây sẽ minh họa cho file Data.in và file Ketqua.out của bài toán
Data.in
Ketqua.out
4 8
14
8 5 3 1
1 1 0 1
4 3 2 1
Bài giải: 3
Bài 4. Viết chương trình giải ô số sudoku.
Cho bảng 9x9, chia làm 9 khối kích thước 3x3. Trong bảng có một số ô đã có số, hãy điền
số vào các ô trống sao cho:
- Mỗi khối 3x3 chỉ chứa các số từ 1 đến 9 và không trùng nhau.
- Mỗi hàng và mỗi cột của bảng 9x9 chỉ chứa các số từ 1 đến 9 và không trùng nhau.
Bài 5. Giống bài 4 nhưng điền số chẵn vào ô màu xanh, số lẻ vào ô màu trắng
21
Bài 6. Giống bài 4 nhưng thay khối 3x3 bằng đa giác.
Bài 7. Giống bài 16 nhưng thay khối 3x3 bằng đa giác có tổng cho trước
Bài 8. Viết lại hàm Bubble Sort sao cho các phần tử lớn lần lượt đưa về cuối dãy (phần tử
lớn được "chìm" xuống).
Bài 9. Sử dụng cấu trúc heap, viết hàm tìm m phần tử lớn nhất trong dãy có n phần tử.
Bài 10. Cho cấu trúc heap có n phần tử, viết hàm xoá phần tử ở vị trí thứ i trên heap sao cho
vẫn bảo toàn cấu trúc heap.
Bài 11. Cài đặt thuật toán Ternary Heap sort (giống thuật toán heap sort) như sau:
Một dãy có n phần tử gọi là một heap (đống) nếu ai >=max (a3i+1, a3i+2,a3i+3) với mọi i =0,
…,n/3-1
Bài 12. Cho file văn bản chứa dãy số nguyên, dùng thuật toán sắp xếp ngoại (merge sort) để
sắp xếp dãy số trong file.
Bài 13. Viết chương trình cộng nhẩm co10 bài, các bài sai được làm lại lần nữa theo thứ tự
sai (bài sai trước làm trước).
1)1+0=2 =>Sai
2)2+1=3 =>Đúng
3)2+3=4 =>Sai
…
10) …
Bạn được làm các bài sai một lần nữa:
1)1+0=1 =>Đúng
22
3)2+3=6 =>Sai, đáp số là 5
vv…
Bạn làm sai 1 bài, được 9 điểm
HD: cất các bài sai vào queue, sau đó lấy ra cho làm lại.
Bài 14. Hãy đề nghị một cách cài đặt queue mà không cần “hy sinh” một ô trống để phân
biệt trường hợp queue trống với trường hợp queue đầy, và hãy cài đặt cụ thể.
HD:
- Tạo queue rỗng: front = rear = -1
- Kiểm tra queue rỗng: front= -1
- Kiểm tra queue đầy: front=rear
- Cất dữ liệu vào queue:
rear=(rear+1)%max
nếu (front=rear) thì thông báo “đầy” và thoát
data[rear]=dl
nếu (front=-1) thì front=0
- Lấy dữ liệu từ queue:
+ nếu (front=-1) thì thông báo “rỗng” và thoát
dl=data[front]
+ nếu (front=rear) thì front=rear=-1 ngược lại front=(front+1)%max
trả về dl.
Bài 15. Hãy xây dựng cấu trúc hàng đợi có độ ưu tiên (mỗi phần tử có một giá trị gọi là độ
ưu tiên, phần tử nào có độ ưu tiên cao hơn sẽ được lấy ra trước) và xây dựng các phép toán
trên cấu trúc này.
HD: Cấu trúc hàng đợi: dùng mảng nhưng không cho vòng lại.
typedef int datatype; //kieu dl trong hang doi
struct pdatatype
{ datatype d; //du lieu
int p; //do uu tien
};
struct queue
{ int rear; //vi tri cat dl, front luon=0, rear la vi tri cua phan tu cuoi hang doi, rear luôn
tăng
pdatatype data[maxqueue];//mang chua cac phan tu cua hang doi
23
(1,1,0)(3,2,3)012…
rearfront
};
Mỗi phần tử trong hàng đợi có một độ ưu tiên, khi cất dl vào hàng đợi, tìm vị trí chèn vào
sao cho hàng đợi luôn là một dãy giảm theo độ ưu tiên. Phần tử được lấy ra luôn là phần tử
đầu hàng đợi (phần tử thứ 0), sau đó dời các phần tử của hàng đợi qua trái một vị trí,
rear=rear-1. Hàng đợi đầy khi rear=maxqueue-1 (khởi tạo ban đầu rear=-1). Hàng đợi rỗng
khi rear=-1
Nhận xét: theo cách trên lấy ra dồn lại, có thể chỉ dồn khi chèn vào mà hết chỗ. Hãy so sánh
và xây thêm cấu trúc theo cách này.
Bài 16. Viết chương trình tự điển Anh-Việt có các hàm sau:
a) Nhập các từ tiếng Anh và nghĩa tiếng việt, ghi vào file tudien.dat dạng nhị phân.
b) Đọc file tudien.dat vào cây BST.
c) Biết từ tiếng Anh, tìm nghĩa tiếng Việt trên cây.
d) Hủy từ tiếng Anh trên cây.
e) Biết từ tiếng Anh, cập nhật nghĩa tiếng Việt trên cây hoặc cập nhật từ tiếng Anh trên cây.
f) Nhập thêm các từ tiếng Anh và nghĩa tiếng việt chèn vào cây.
g) Ghi cây vào file tudien.dat theo thứ tự anphabet của phần tiếng Anh.
Bài 17. Làm giống bài 6 nhưng dùng file index, nghĩa là mỗi nút chỉ lưu từ tiếng Anh và số
thứ tự của mẫu tin chứa từ tiếng Anh này trong file tudien.dat.
Bài 18. Số điện thọai di động của một hãng viễn thông được đánh số theo qui cách
091N.XXX.XXX, trong đó N là số nguyên từ 1 đến 4 và X là số nguyên từ 0 đến 9. Trong
dịp khuyến mãi, công ty phát hành hai lọai số điện thọai có tính chất sau để thu hút khách
hàng sử dụng dịch vụ:
- Số điện thọai lọai I: là những số mà sáu chữ số cuối khi đọc xuôi từ trái sang phải hay từ phải sang
trái đều nhận được cùng một số có sáu chữ số. Ví dụ: sô 0913 558855
- Số điện thọai lọai II: là những số điện thọai lọai I mà tổng sáu chữ số cuối bằng 8. Ví dụ số
0913 202202.
Hãy viết chương trình ghi các số điện thọai lọai I trong file data1.out và ghi các số điện
thọai lọai II trong file data2.out theo quy cách sau: dòng đầu tiên ghi số các số điện thoại
lọai I hay II, các d2ng tiếp theo ghi danh sách các số tìm được, mỗi số trên một dòng.
Bài giải: 24
Bài 19. Cho đồ thị vô hướng được lưu trữ trong file văn bản dothi.in theo khuôn dạng sau:
- Dòng đầu tiên ghi số đỉnh của đồ thị
- Mỗi dòng kế tiếp ghi hai đỉnh của một cạnh đồ thị, hai đỉnh được ghi cách nhau một hoặc
vài ký tự trống.
Viết chương trình kiểm tra tính liên thông của đồ thị, kết quả được ghi trong file văn bản
ketqua.out theo khuôn dạng như sau:
- Dòng thứ nhất ghi : đồ thị liên thông hoặc đồ thị không liên thông
- Nếu đồ thị không liên thông thì mỗi dòng tiếp theo ghi các đỉnh của một thành phần liên
thông.
Ví dụ:
24
file ketqua.out
do thi khong lien thong
thanh phan lien thong thu 1: 1 2 7
thanh phan lien thong thu 2: 3 5
thanh phan lien thong thu 3: 4 6 8
file dothi.in
8
1 2
1 7
2 7
3 5
4 6
4 8
6 8
Bài giải 25:
Bài 20.
a) Cài đặt thuật toán Heap Sort (heap bậc 2): dãy ai gọi là heap nếu ai>=a2i ; a2i+1 với mọi
i=1,2,...
b) Cài đặt thuật toán Ternary Heap sort (heap bậc 3): dãy ai gọi là heap nếu ai>=a3i-1; a3i;
a3i+1 với mọi i=1,2,….
c) Cài đặt thuật toán Heap sort có heap bậc 4 như sau: dãy ai gọi là heap nếu ai>=a4i-2; a4i-1;
a4i ; a4i+1 với mọi i=1,2,….
Bài giải 26
Bài 21. Cài đặt thuật tóan quick sort, không dùng kỹ thuật đệ qui, dùng stack để khử đệ qui,
stack được cài đặt bằng danh sách liên kêt.
Bài giải 27
Bài 22. Cho file văn bản chứa dãy số nguyên, dùng thuật toán merge sort để sắp xếp dãy số
trên file.
Bài giải 28
Bài 23. Viết chương trình quản lý điểm sinh viên có các chức năng sau:
a) Nhập bảng điểm lưu vào file sinhvien.dat dạng nhị phân, biết rằng mỗi mẫu tin trong file
sinhvien.dat có cấu trúc sau: mã sinh viên, họ, tên, điểm lý thuyết, điểm thực hành, điểm
trung bình.
b) Xuất file sinhvien.dat ra màn hình.
c) Dùng thuật toán sắp xếp ngoại (merge sort) để sắp xếp file sinhvien.dat trong hai trường
hợp sau:
+ sắp xếp theo thứ tự điểm trung bình giảm dần.
+ sắp xếp theo tên, cùng tên sắp theo họ.
d) Dùng thuật toán tìm nhị phân để tìm sinh viên theo mã sinh viên
Bài giải 29
Bài 24. Cây khung (Prim)
Cho đồ thị vô hướng, liên thông được lưu trữ trong file văn bản caykhung.in theo khuôn
dạng sau:
- Dòng đầu tiên ghi số đỉnh và đỉnh xuất phát s.
25
- Mỗi dòng kế tiếp ghi đỉnh đầu, đỉnh cuối và trọng số của một cạnh.
Viết chương trình tìm cây khung ngắn nhất của đồ thị, kết quả được ghi trong file văn bản
caykhung.out, theo khuôn dạng sau:dòng đầu tiên ghi số cạnh và chiều dài cây khung, các
dòng tiếp theo ghi các cạnh cây khung, mỗi dòng ghi một cạnh cùng trọng số của cạnh.
Ví dụ:
file caykhung.in
6 1
1 2 33
1 3 17
2 3 18
2 4 20
3 4 16
3 5 4
4 5 9
4 6 8
5 6 14
file caykhung.out
5 56
3 1 17
5 3 4
4 5 9
6 4 8
2 3 18
Bài giải 30:
Bài 25. Hãy viết chương trình liệt kê tất cả các số tự nhiên K thỏa mãn đồng thời các điều
kiện (a), (b), (c) và (d) dưới đây, biết rằng P, S, B được nhập từ bàn phím:
a) K là số nguyên tố có từ a đến b chữ số. (a,b nhập từ bàn phím và 1<=a,b<=9; a<=b)
b) Các chữ số của K khác P (P = 0, 1, 2, ..,9).
c) Tổng các chữ số của K chia hết cho S.
d) Biểu diễn của K ở hệ cơ số B là một số thuận nghịch (số K được gọi là thuận nghịch nếu
ta đọc từ trái sang phải hay từ phải sang trái các chữ số của K ta đều nhận được chính nó).
Bài giải 31:
Bài 26. Dãy con có tổng lớn nhất
Bạn nào có code để tìm dãy con tăng có tổng lớn nhất trong một dãy số cho trước (thực
hay nguyên tùy ý)?
Bạn đưa yêu cầu chưa rõ vì nếu chỉ yêu cầu dãy con có tổng lớn nhất thì chính dãy đã cho
là có tổng lớn nhất.
Cũng có thể là bài toán dãy con không giảm dài nhất, bạn có nắm rõ đề bài không?
Cảm ơn anh admin, đúng là dãy con tăng có tổng lớn nhất.
Ví dụ:
VD: 1 2 4 5 2 3 0 1 5 8 9 12 1 0 3
thì có các dãy "con tăng" là :
1 2 4 5
26
1
2 4
6
53
33
18
17
4
14
8
16
20
9
2 3
0 1 5 8 9 12
0 3
vậy là có 4 dãy con tăng trong đó chỉ in ra dãy con tăng dài nhất là: 0 1 5 8 9 12
Bài 27. Dãy con TĂNG hay KHÔNG GIẢM?
Nếu là yêu cầu như vậy thì rất đơn giản, chi phí thuật toán là O(n) thôi.
Bạn dùng 2 biến để lưu tổng giá trị lớn nhất hiện hành và chỉ số của phần tử sau cùng của
dãy con đó.
Bạn dùng 2 biến khác để lưu tổng giá trị và chỉ số sau cùng của dãy đang xét.
Nếu kết thúc dãy đang xét thì so sánh với dãy lớn nhất hiện hành để cập nhật lại dãy lớn
nhất nếu có.
Chỉ cần 1 vòng lặp for là đủ.
Đề bài phát biểu là dãy con tăng chứ không phải dãy con tăng liên tiếp. Theo như ví dụ của
meocon thì dãy con tăng có tổng lớn nhất phải là: 1 2 4 5 8 9 12. Bạn meocon kiểm tra lại
xem.
Bài 28. Đếm số password!
Mỗi người dùng trong một hệ thống máy tính đều có một password dài 6 ký tự , trong đó
các ký tự là chữ cái hoa hay chữ số, hay ký tự lạ. Mỗi password phải chứa ít nhất 1 chữ cái
hoa, một chữ số và một ký tự lạ. Hõi có thể có bao nhiêu password.
Gọi n là số ký tự lạ được phép dùng đặt password.
Tổng số password có thể có: (26+10+n)6
= (36+n)6
(1)
Tổng số password không chứa chữ cái hoa: (10+n)6
(2)
Tổng số password không chứa chữ số: (26+n)6
(3)
Tổng số password không chứa ký tự lạ: (26+10)6
=366
(4)
Vậy số password dài 6 ký tự có chứa ít nhất 1 chữ cái hoa, 1 chữ số và 1 ký tự lạ là:
(1) - (2) - (3) - (4) = (36+n)6
- (10+n)6
- (26+n)6
- 366
Theo tôi,
"Tổng số password có thể có: (26+10+n)6
= (36+n)6
" là ko đúng mà phải là "Chỉnh hợp
chập 6 của (26+10+n) phần tử".
Do đó
Tổng số password có thể có: (36+n)! / (30+n)!
Xin cho ý kiến nếu tôi nhầm lẫn , tks
Cảm ơn bạn đã đóng góp ý kiến. Mình xin phân tích như sau:
Password có 6 ký tự, mỗi ký tự có (26+10+n) cách chọn.
Vậy ký tự thứ 1 có (26+10+n) cách chọn. Ứng với mỗi cách chọn của ký tự thứ 1, thì ký tự
thứ 2 cũng có (26+10+n) cách chọn. Tương tự cho ký tự thứ 6.
Theo nguyên lý nhân của phép đếm thì tổng số cách chọn sẽ là (26+10+n)6
.
Nếu hiểu là password phải vừa có ít nhất một chữ cái hoa, vừa có ít nhất một số, và vừa có ít
nhất 1 ký tự lạ thì:
Tổng số pass word có thể có ở đây còn bao gồm cả loại: chỉ toàn chữ hoa(26^6), chỉ toàn
số(10^6), chỉ toàn ký tự lạ(n^6).Mình cần trừ thêm khoảng này này nữa.
Hông biết em hiểu có đúng đề bài hông nữa?
Cảm ơn câu hỏi của bạn dù rằng trong cách giải trên của mình đã trừ luôn những trường hợp
bạn đưa ra. Nhưng nhờ câu hỏi của bạn mà mình nghĩ kỹ thì thấy cách giải trên đã trừ dư
(trừ lặp), nghĩa là đã bị sai.
Xin được phân tích lại bài toán:
27
Gọi X là tập tất cả password có chứa ít nhất 1 chữ cái hoa, một chữ số và một ký tự lạ
Gọi A là tập tất cả password, |A| = (26 + 10 + n)6
.
Gọi B là tập tất cả password không chứa chữ cái hoa, |B| = (10 + n)6
.
Gọi C là tập tất cả password không chứa chữ số, |C| = (26 + n)6
.
Gọi D là tập tất cả password không chứa chữ ký tự lạ, |D| = (26 + 10)6
.
Khi đó:
Trong đó:
- B ∩ C là tập các password không chứa chữ cái hoa và chữ số, nghĩa là chỉ chứa kí tự lạ, |B
∩ C| = n6
.
- B ∩ D là tập các password không chứa chữ cái hoa và kí tự lạ, nghĩa là chỉ chứa chữ số, |B
∩ D| = 106
.
- C ∩ D là tập các password không chứa chữ số và kí tự lạ, nghĩa là chỉ chứa chữ cái hoa, |C
∩ D| = 266
.
- B ∩ C ∩ D là tập các password không chứa chữ cái hoa, chữ số và kí tự lạ, tập này là rỗng.
Vậy |X| = (26 + 10 + n)6
- (10 + n)6
- (26 + n)6
- (26 + 10)6
+ n6
+ 106
+ 266
.
Ah, đúng rùi trong cách làm cũ của admin đã bao gồm cái em hỏi rùi. Hihi...
Nhưng với cách làm mới của anh thì:
- Chứng minh thì hợp lý.
- Nhưng hiểu theo nghĩa thông thường thì hổng hợp lý phải hông admin (tại sao hổng trừ cái
khoản đó ra? Tại sao admin bảo là bị lặp?).
Bài 29. Cho đồ thị vô hướng được lưu trữ trong file văn bản dothi.in theo khuôn dạng sau:
- Dòng đầu tiên ghi số đỉnh của đồ thị
- Mỗi dòng kế tiếp ghi hai đỉnh của một cạnh đồ thị, hai đỉnh được ghi cách nhau một hoặc
vài ký tự trống.
Viết chương trình kiểm tra tính liên thông của đồ thị, kết quả được ghi trong file văn bản
ketqua.out theo khuôn dạng như sau:
- Dòng thứ nhất ghi : đồ thị liên thông hoặc đồ thị không liên thông
- Nếu đồ thị không liên thông thì mỗi dòng tiếp theo ghi các đỉnh của một thành phần liên
thông.
Ví dụ:
file dothi.in
8
1 2
1 7
2 7
3 5
4 6
28
file ketqua.out
do thi khong lien thong
thanh phan lien thong thu 1: 1 2 7
thanh phan lien thong thu 2: 3 5
thanh phan lien thong thu 3: 4 6 8
4 8
6 8
Chú ý: làm bài tập tương tự với đồ thị có hướng
Bài giải 35
Bài 30. Cho n thành phố, người du lịch xuất phát từ một thành phố, đi thăm tất cả các thành
phố còn lại mỗi thành phố một lần và quay về thành phố xuất phát. Viết chương trình tìm lộ
trình có chi phí nhỏ nhất, biết rằng bảng chi phí lưu trong file văn bản Chiphi.in theo khuôn
dạng sau:
• Dòng đầu tiên ghi lại hai số tự nhiên n và s (n là số thành phố, s là thành phố xuất
phát), hai số được viết cách nhau bởi một hoặc vài kí tự trống.
• Trên n dòng kế tiếp, dòng thứ i (i=1,..,n) ghi n số nguyên dương ci,1; ci,2;…; ci,n với ci,j
là chi phí đi từ thành phố thứ i đến thành phố j, ci,j bằng 0 nếu không có đường đi trực
tiếp từ i đến j, các số được viết cách nhau bởi một hoặc vài kí tự trống.
Chi phí nhỏ nhất và lộ trình có chi phí nhỏ nhất tìm được, hãy ghi lại trong file Lotrinh.out
theo khuôn dạng sau:
• Dòng đầu tiên ghi lại chi phí nhỏ nhất.
• Dòng kế tiếp ghi lại lộ trình tối ưu.
Ví dụ dưới đây sẽ minh họa cho file Chiphi.in và file Lotrinh.out của bài toán
Chiphi.in
Lotrinh.out
4 3
0 5 3 1
4 0 2 4
6 1 0 5
9 3 2 0
Bài giải 36
Bài 31. Số điện thoại di động của một hãng viễn thông là một số có 10 chữ số dạng
09.M.N.XXX.XXX. Miền xác định của các chữ số M, N. X được xác định như sau:
• M là số có giá trị từ 1 đến 7.
• N là số có giá trị từ 2 đến 9.
• X là số có giá trị từ 0 đến 9.
Hãy cho biết hãng viễn thông có thể phát hành được bao nhiêu số điện thoại thuộc mỗi loại
a, b, c, d dưới đây?
a) Số các số di động có sáu số cuối cùng XXX.XXX tạo thành một số thuận nghịch sáu chữ
số? Ví dụ số: 0913. 103301 có sáu số cuối cùng là 103301 là số thuận nghịch.
b) Số các số di động có sáu số cuối cùng XXX.XXX tạo thành một số thuận nghịch sáu chữ
số và tất cả các chữ số này đều khác 0? Ví dụ số: 091.2.122221 có sáu số cuối cùng 122221
là một số thuận nghịch và không chứa số 0 nào.
c) Số các số di động có sáu số cuối cùng XXX.XXX là một số thuận nghịch có sáu chữ số
và tổng sáu chữ số cuối cùng là 20? Ví dụ số: 0913.505505.
29
d) Số các số di động có sáu số cuối cùng XXX.XXX là một số thuận nghịch có sáu chữ số
và tổng sáu chữ số cuối cùng là 42? Ví dụ số: 0913.984489.
e) Số các số di động có sáu số cuối cùng X1X2X3.X4X5X6 là một số thuận nghịch có sáu
chữ số và tổng sáu chữ số cuối cùng là 42? Biết rằng 1<X1<=3; 3<=X2<5;X3<=2
HD:
a) 7.8.9.10.10=50400
b) 7.8.9.9.9=40824
c) x1+x2+x3=10 (1<=x1<=9; 0<=x2<=9; 0<=x3<=9)
Đặt:
A={1<=x1<=9; 0<=x2<=9; 0<=x3<=9}; |A|=?
X={x1>=1; x2>=0; x3>=0 }=>|X|=C(n+k-1,k)=C(11,9)=55
Ta có:
A⊆X=>|A|=|X|-|A|
A ={x1>=10 hoặc x2>=10 hoặc x3>=10}=A1∪A2∪A3
với:
A1={x1>=10; x2>=0; x3>=0}=>|A1|=C(2,0)=1
A2={x1>=1; x2>=10; x3>=0}=>|A2|=0
A3={x1>=1; x2>=0; x3>=10}=>|A3|=0
do Ai∩Aj =∅ với i≠j nên
|A|=| A1∪A2∪A3|=|A1|+|A2|+|A3|=1
=> |A|=55-1=54
=>Đáp số= 56.54=3024
d) x1+x2+x3=21 (1<=x1<=9; 0<=x2<=9; 0<=x3<=9)
Đặt:
A={1<=x1<=9; 0<=x2<=9; 0<=x3<=9}; |A|=?
X={x1>=1; x2>=0; x3>=0 }=>|X|= C(22,20)=231
Ta có:A⊆X=>|A|=|X|-|A|
A ={x1>=10 hoặc x2>=10 hoặc x3>=10}=A1∪A2∪A3
với: A1={x1>=10; x2>=0; x3>=0};A2={x1>=1; x2>=10; x3>=0}
A3={x1>=1; x2>=0; x3>=10}
|A|=| A1∪A2∪A3|=|A1|+|A2|+|A3|-|A1∩A2|-|A1∩A3|-|A2∩A3|+|A1∩A2∩A3|
Ta có:
|A1|= C(13,11)=78
|A2|=|A3|=C(12,10)=66
|A1∩A2|=|A1∩A3|= C(3,1)=3; |A2∩A3|=C(2,0)=1
30
|A1∩A2∩A3|=0
Vậy:
|A|=78+66+66-3-3-1+0=203=> |A|=231-203=28
=>Đáp số= 56.28=1568
e) x1+x2+x3=21 (1<x1<=3; 3<=x2<5;x3<=2)
Đặt:
A={1<x1<=3; 3<=x2<5; x3<=2}; |A|=?
X={x1>=2; x2>=3; x3>=0 }=>|X|=C(n+k-1,k)=C(3+16-1,16)=C(18,16)=153
Ta có:
A⊆X=>|A|=|X|-|A|
A ={x1>=4 hoặc x2>=5 hoặc x3>=3}=A1∪A2∪A3
với:
A1={x1>=4; x2>=3; x3>=0}
A2={x1>=2; x2>=5; x3>=0}
A3={x1>=2; x2>=3; x3>=3}
|A|=| A1∪A2∪A3|=|A1|+|A2|+|A3|-|A1∩A2|-|A1∩A3|-|A2∩A3|+|A1∩A2∩A3|
Ta có:
|A1|=|A2|=C(16,14)=120; |A3|=C(15,13)=105
|A1∩A2|=C(14,12)=91; |A1∩A3|=|A2∩A3|=C(13,11)=78
|A1∩A2∩A3|= C(11,9)=55
Vậy:
/|A|=120+120+105-91-78-78+55=153 => |A|=0
=>Đáp số=56.0=0
Bài 32. Bài 1:
a) Cài đặt thuật toán Heap Sort: dãy ai gọi là heap nếu ai>=a2i ; a2i+1 với mọi i=1,2,...
b) Cài đặt thuật toán Ternary Heap sort: dãy ai gọi là heap nếu ai>=a3i-1; a3i; a3i+1 với mọi
i=1,2,….
Bài giải 39
31

More Related Content

What's hot

Trắc nghiệm Đồ thị hàm số (Chủ đề 5)
Trắc nghiệm Đồ thị hàm số (Chủ đề 5)Trắc nghiệm Đồ thị hàm số (Chủ đề 5)
Trắc nghiệm Đồ thị hàm số (Chủ đề 5)VuKirikou
 
Bài tập thực hành số 1
Bài tập thực hành số 1Bài tập thực hành số 1
Bài tập thực hành số 1Tran Trung Dung
 
Thuat toan tin hoc
Thuat toan tin hocThuat toan tin hoc
Thuat toan tin hocladoga
 
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPTBài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPTMasterCode.vn
 
Giai phuong trinh bang excell
Giai phuong trinh bang excellGiai phuong trinh bang excell
Giai phuong trinh bang excelltrioby2
 
Bài tập CTDL và GT 9
Bài tập CTDL và GT 9Bài tập CTDL và GT 9
Bài tập CTDL và GT 9Hồ Lợi
 
Bài tập CTDL và GT 1
Bài tập CTDL và GT 1Bài tập CTDL và GT 1
Bài tập CTDL và GT 1Hồ Lợi
 
Lap trinh matlab_co_ban_1731
Lap trinh matlab_co_ban_1731Lap trinh matlab_co_ban_1731
Lap trinh matlab_co_ban_1731Vu Tuan
 
Thuat toan sap xep trao doi
Thuat toan sap xep trao doiThuat toan sap xep trao doi
Thuat toan sap xep trao doilantbinh
 
De thithu.net -4-de-thi-thu-toan-trac-nghiem-2017-co-dap-an-t10.id-file-530
De thithu.net -4-de-thi-thu-toan-trac-nghiem-2017-co-dap-an-t10.id-file-530De thithu.net -4-de-thi-thu-toan-trac-nghiem-2017-co-dap-an-t10.id-file-530
De thithu.net -4-de-thi-thu-toan-trac-nghiem-2017-co-dap-an-t10.id-file-530B_G Pro
 
Bai toan va thuat toan
Bai toan va thuat toanBai toan va thuat toan
Bai toan va thuat toanlethilien1993
 
Homework - C programming language
Homework - C programming languageHomework - C programming language
Homework - C programming languageLinh Lê
 
Sap xep va tim kiem
Sap xep va tim kiem Sap xep va tim kiem
Sap xep va tim kiem acumenvn
 
Bai toan va thuat toan
Bai toan va thuat toanBai toan va thuat toan
Bai toan va thuat toanHữu Duy Duy
 
Chuong 2 phan tich cac thuat toan sap xep va tim kiem
Chuong 2  phan tich cac thuat toan sap xep va tim kiemChuong 2  phan tich cac thuat toan sap xep va tim kiem
Chuong 2 phan tich cac thuat toan sap xep va tim kiemgaconne1985
 
Trắc nghiệm cực trị hàm số (chủ đề 2)
Trắc nghiệm cực trị hàm số (chủ đề 2)Trắc nghiệm cực trị hàm số (chủ đề 2)
Trắc nghiệm cực trị hàm số (chủ đề 2)VuKirikou
 
ThiếT Kế Và đáNh Giá ThuậT ToáN
ThiếT Kế Và đáNh Giá ThuậT ToáNThiếT Kế Và đáNh Giá ThuậT ToáN
ThiếT Kế Và đáNh Giá ThuậT ToáNguest717ec2
 

What's hot (19)

Trắc nghiệm Đồ thị hàm số (Chủ đề 5)
Trắc nghiệm Đồ thị hàm số (Chủ đề 5)Trắc nghiệm Đồ thị hàm số (Chủ đề 5)
Trắc nghiệm Đồ thị hàm số (Chủ đề 5)
 
Bài tập thực hành số 1
Bài tập thực hành số 1Bài tập thực hành số 1
Bài tập thực hành số 1
 
Thuat toan tin hoc
Thuat toan tin hocThuat toan tin hoc
Thuat toan tin hoc
 
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPTBài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
 
Giai phuong trinh bang excell
Giai phuong trinh bang excellGiai phuong trinh bang excell
Giai phuong trinh bang excell
 
Bài tập CTDL và GT 9
Bài tập CTDL và GT 9Bài tập CTDL và GT 9
Bài tập CTDL và GT 9
 
Bài tập CTDL và GT 1
Bài tập CTDL và GT 1Bài tập CTDL và GT 1
Bài tập CTDL và GT 1
 
Lap trinh matlab_co_ban_1731
Lap trinh matlab_co_ban_1731Lap trinh matlab_co_ban_1731
Lap trinh matlab_co_ban_1731
 
Thuat toan sap xep trao doi
Thuat toan sap xep trao doiThuat toan sap xep trao doi
Thuat toan sap xep trao doi
 
De thithu.net -4-de-thi-thu-toan-trac-nghiem-2017-co-dap-an-t10.id-file-530
De thithu.net -4-de-thi-thu-toan-trac-nghiem-2017-co-dap-an-t10.id-file-530De thithu.net -4-de-thi-thu-toan-trac-nghiem-2017-co-dap-an-t10.id-file-530
De thithu.net -4-de-thi-thu-toan-trac-nghiem-2017-co-dap-an-t10.id-file-530
 
Bai toan va thuat toan
Bai toan va thuat toanBai toan va thuat toan
Bai toan va thuat toan
 
Bai 4
Bai 4Bai 4
Bai 4
 
Homework - C programming language
Homework - C programming languageHomework - C programming language
Homework - C programming language
 
Sap xep va tim kiem
Sap xep va tim kiem Sap xep va tim kiem
Sap xep va tim kiem
 
Bai giang
Bai giangBai giang
Bai giang
 
Bai toan va thuat toan
Bai toan va thuat toanBai toan va thuat toan
Bai toan va thuat toan
 
Chuong 2 phan tich cac thuat toan sap xep va tim kiem
Chuong 2  phan tich cac thuat toan sap xep va tim kiemChuong 2  phan tich cac thuat toan sap xep va tim kiem
Chuong 2 phan tich cac thuat toan sap xep va tim kiem
 
Trắc nghiệm cực trị hàm số (chủ đề 2)
Trắc nghiệm cực trị hàm số (chủ đề 2)Trắc nghiệm cực trị hàm số (chủ đề 2)
Trắc nghiệm cực trị hàm số (chủ đề 2)
 
ThiếT Kế Và đáNh Giá ThuậT ToáN
ThiếT Kế Và đáNh Giá ThuậT ToáNThiếT Kế Và đáNh Giá ThuậT ToáN
ThiếT Kế Và đáNh Giá ThuậT ToáN
 

Viewers also liked (16)

Programa de gobierno departamental del partido colorado en Río Negro
Programa de gobierno departamental del partido colorado en Río NegroPrograma de gobierno departamental del partido colorado en Río Negro
Programa de gobierno departamental del partido colorado en Río Negro
 
Bai9 caycanbang
Bai9 caycanbangBai9 caycanbang
Bai9 caycanbang
 
3
33
3
 
4
44
4
 
6
66
6
 
Bai10 stack queue
Bai10 stack queueBai10 stack queue
Bai10 stack queue
 
Baigiang ctdl
Baigiang ctdlBaigiang ctdl
Baigiang ctdl
 
Life in the fast lane
Life in the fast laneLife in the fast lane
Life in the fast lane
 
5
55
5
 
Fisiologia de la membrana
Fisiologia de la membranaFisiologia de la membrana
Fisiologia de la membrana
 
2
22
2
 
Subsequent event ppt 1
Subsequent event ppt 1Subsequent event ppt 1
Subsequent event ppt 1
 
Aprendizaje ¿investigación?
Aprendizaje ¿investigación?Aprendizaje ¿investigación?
Aprendizaje ¿investigación?
 
TiO2
TiO2TiO2
TiO2
 
Estacion 5
Estacion 5Estacion 5
Estacion 5
 
Trabajo nº 4 1
Trabajo nº 4   1Trabajo nº 4   1
Trabajo nº 4 1
 

Similar to Baitap ktlt

Chuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdfChuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdfHngTrn365275
 
Chuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdfChuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdfnguyenkaka2
 
304686218-Chia-đoi-tập-vdgdhợp-2.docx
304686218-Chia-đoi-tập-vdgdhợp-2.docx304686218-Chia-đoi-tập-vdgdhợp-2.docx
304686218-Chia-đoi-tập-vdgdhợp-2.docxNguynAnThch
 
Bai tap lam quen java (1)
Bai tap lam quen java (1)Bai tap lam quen java (1)
Bai tap lam quen java (1)dangtrongphu123
 
Baigiang4 thuattoan-120116191825-phpapp02
Baigiang4 thuattoan-120116191825-phpapp02Baigiang4 thuattoan-120116191825-phpapp02
Baigiang4 thuattoan-120116191825-phpapp02Trần Huy
 
Bai giang 4 thuat toan
Bai giang 4   thuat toanBai giang 4   thuat toan
Bai giang 4 thuat toanladoga
 
Decuongontaptoan8hk21657 150928065453-lva1-app6892
Decuongontaptoan8hk21657 150928065453-lva1-app6892Decuongontaptoan8hk21657 150928065453-lva1-app6892
Decuongontaptoan8hk21657 150928065453-lva1-app6892Phượng Hoàng
 
De cuong on_tap_toan_8_hk2_1657
De cuong on_tap_toan_8_hk2_1657De cuong on_tap_toan_8_hk2_1657
De cuong on_tap_toan_8_hk2_1657Phượng Hoàng
 
Ctdl lab07-cac thuat-toan_sap_xep
Ctdl lab07-cac thuat-toan_sap_xepCtdl lab07-cac thuat-toan_sap_xep
Ctdl lab07-cac thuat-toan_sap_xepNguyễn Ngọc Hà
 
Bài 11 Kiểu mảng(tt)
Bài 11 Kiểu mảng(tt)Bài 11 Kiểu mảng(tt)
Bài 11 Kiểu mảng(tt)Võ Tâm Long
 
12.ma trận và dịnh thức
12.ma trận và dịnh thức12.ma trận và dịnh thức
12.ma trận và dịnh thứcTrinh Yen
 
[Math educare.com] giai tich ham nhieu bien-phep tinh vi phan ham nhieu bien_...
[Math educare.com] giai tich ham nhieu bien-phep tinh vi phan ham nhieu bien_...[Math educare.com] giai tich ham nhieu bien-phep tinh vi phan ham nhieu bien_...
[Math educare.com] giai tich ham nhieu bien-phep tinh vi phan ham nhieu bien_...Nguyen Vietnam
 
Bài tập CTDL và GT 4
Bài tập CTDL và GT 4Bài tập CTDL và GT 4
Bài tập CTDL và GT 4Hồ Lợi
 
Mot so bai toan quy hoach dong
Mot so bai toan quy hoach dongMot so bai toan quy hoach dong
Mot so bai toan quy hoach dongANHMATTROI
 

Similar to Baitap ktlt (20)

Chuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdfChuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdf
 
Chuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdfChuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdf
 
304686218-Chia-đoi-tập-vdgdhợp-2.docx
304686218-Chia-đoi-tập-vdgdhợp-2.docx304686218-Chia-đoi-tập-vdgdhợp-2.docx
304686218-Chia-đoi-tập-vdgdhợp-2.docx
 
Lttt matlab bt1
Lttt matlab bt1Lttt matlab bt1
Lttt matlab bt1
 
Baitapjava
BaitapjavaBaitapjava
Baitapjava
 
Bai tap lam quen java (1)
Bai tap lam quen java (1)Bai tap lam quen java (1)
Bai tap lam quen java (1)
 
Bai tap lam quen java
Bai tap lam quen javaBai tap lam quen java
Bai tap lam quen java
 
Ch1.DSTT_Slides.pdf
Ch1.DSTT_Slides.pdfCh1.DSTT_Slides.pdf
Ch1.DSTT_Slides.pdf
 
Baigiang4 thuattoan-120116191825-phpapp02
Baigiang4 thuattoan-120116191825-phpapp02Baigiang4 thuattoan-120116191825-phpapp02
Baigiang4 thuattoan-120116191825-phpapp02
 
Bai giang 4 thuat toan
Bai giang 4   thuat toanBai giang 4   thuat toan
Bai giang 4 thuat toan
 
Ctdl de so 14
Ctdl   de so 14Ctdl   de so 14
Ctdl de so 14
 
Decuongontaptoan8hk21657 150928065453-lva1-app6892
Decuongontaptoan8hk21657 150928065453-lva1-app6892Decuongontaptoan8hk21657 150928065453-lva1-app6892
Decuongontaptoan8hk21657 150928065453-lva1-app6892
 
De cuong on_tap_toan_8_hk2_1657
De cuong on_tap_toan_8_hk2_1657De cuong on_tap_toan_8_hk2_1657
De cuong on_tap_toan_8_hk2_1657
 
Ctdl lab07-cac thuat-toan_sap_xep
Ctdl lab07-cac thuat-toan_sap_xepCtdl lab07-cac thuat-toan_sap_xep
Ctdl lab07-cac thuat-toan_sap_xep
 
Bài 11 Kiểu mảng(tt)
Bài 11 Kiểu mảng(tt)Bài 11 Kiểu mảng(tt)
Bài 11 Kiểu mảng(tt)
 
12.ma trận và dịnh thức
12.ma trận và dịnh thức12.ma trận và dịnh thức
12.ma trận và dịnh thức
 
[Math educare.com] giai tich ham nhieu bien-phep tinh vi phan ham nhieu bien_...
[Math educare.com] giai tich ham nhieu bien-phep tinh vi phan ham nhieu bien_...[Math educare.com] giai tich ham nhieu bien-phep tinh vi phan ham nhieu bien_...
[Math educare.com] giai tich ham nhieu bien-phep tinh vi phan ham nhieu bien_...
 
Bài tập CTDL và GT 4
Bài tập CTDL và GT 4Bài tập CTDL và GT 4
Bài tập CTDL và GT 4
 
Toan 8 tham khao hk i
Toan 8 tham khao hk iToan 8 tham khao hk i
Toan 8 tham khao hk i
 
Mot so bai toan quy hoach dong
Mot so bai toan quy hoach dongMot so bai toan quy hoach dong
Mot so bai toan quy hoach dong
 

More from Hồ Lợi

Tóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cTóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cHồ Lợi
 
Lect04 functions
Lect04 functionsLect04 functions
Lect04 functionsHồ Lợi
 
Ky thuatkhudequy
Ky thuatkhudequyKy thuatkhudequy
Ky thuatkhudequyHồ Lợi
 
Itt epc assignment
Itt epc assignmentItt epc assignment
Itt epc assignmentHồ Lợi
 
Huong danontapc
Huong danontapcHuong danontapc
Huong danontapcHồ Lợi
 
H hai epc_baitap
H hai epc_baitapH hai epc_baitap
H hai epc_baitapHồ Lợi
 
Giaotrinhbaitapkythuatlaptrinh
GiaotrinhbaitapkythuatlaptrinhGiaotrinhbaitapkythuatlaptrinh
GiaotrinhbaitapkythuatlaptrinhHồ Lợi
 
Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2Hồ Lợi
 
Giao trinh c c++
Giao trinh c c++Giao trinh c c++
Giao trinh c c++Hồ Lợi
 
Epc assignment
Epc assignmentEpc assignment
Epc assignmentHồ Lợi
 
Epc test practical
Epc test practicalEpc test practical
Epc test practicalHồ Lợi
 
De thic++ --th
De thic++ --thDe thic++ --th
De thic++ --thHồ Lợi
 

More from Hồ Lợi (20)

Xu ly chuoi
Xu ly chuoiXu ly chuoi
Xu ly chuoi
 
Tóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cTóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của c
 
T4
T4T4
T4
 
Nguyen lyoop
Nguyen lyoopNguyen lyoop
Nguyen lyoop
 
Lect04 functions
Lect04 functionsLect04 functions
Lect04 functions
 
Ky thuatkhudequy
Ky thuatkhudequyKy thuatkhudequy
Ky thuatkhudequy
 
Itt epc assignment
Itt epc assignmentItt epc assignment
Itt epc assignment
 
Huong danontapc
Huong danontapcHuong danontapc
Huong danontapc
 
H hai epc_baitap
H hai epc_baitapH hai epc_baitap
H hai epc_baitap
 
Gtrinh oop
Gtrinh oopGtrinh oop
Gtrinh oop
 
Giaotrinhbaitapkythuatlaptrinh
GiaotrinhbaitapkythuatlaptrinhGiaotrinhbaitapkythuatlaptrinh
Giaotrinhbaitapkythuatlaptrinh
 
Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2
 
Giao trinh c c++
Giao trinh c c++Giao trinh c c++
Giao trinh c c++
 
File trong c_
File trong c_File trong c_
File trong c_
 
Epc assignment
Epc assignmentEpc assignment
Epc assignment
 
Epc test practical
Epc test practicalEpc test practical
Epc test practical
 
De thic++ --th
De thic++ --thDe thic++ --th
De thic++ --th
 
Dethi c++ -lt
Dethi c++ -ltDethi c++ -lt
Dethi c++ -lt
 
Debug trong c
Debug trong cDebug trong c
Debug trong c
 
D05 stl
D05 stlD05 stl
D05 stl
 

Baitap ktlt

  • 1. I. BÀI TẬP CĂN BẢN Bài 1. Xét hai giải thuật tính gần đúng ex bằng công thức: ex = 1+x/1!+x2 /2!+…+xn /n! (x,n cho trước). 1+2/1+4/2=4 + Giải thuật 1: Tính từng số hạng rồi cộng lại + Giải thuật 2: Dựa vào số hạng trước, tính số hạng sau 1) Trình bày các bước thực hiện giải thuật 1 và 2. 2) Đánh giá hai giải thuật Bài 2. Liệt kê tất cả các dãy nhị phân chiều dài bằng n(Bằng giải thuật sinh) Bài 3. Liệt kê các hoán vị của tập X={1,…,n} Bài 4. Liệt kê các tổ hợp chặp m của tập X={1,…,n} Bài 5. Liệt kê các chỉnh hợp không lặp chặp m của tập X={1,…,n} Bài 6. Liệt kê các chỉnh hợp lặp chặp m của tập X={1,…,n} II. BÀI TẬP MẢNG Bài 1. Tìm cách chia mảng nguyên dương n phần tử cho trước thành hai đoạn có tổng các phần tử trong mỗi đoạn bằng nhau. Bài 2. Tìm cách chia mảng nguyên dương n phần tử cho trước thành hai đoạn có tổng các phần tử trong mỗi đoạn này bằng k lần tổng các phần tử trong đoạn kia với k là số nguyên dương. Bài 3. Cho trước mảng 2 chiều A[1:n][1:n], mỗi phần tử của nó bằng 0, 1, 5 hoặc 11. Hãy tính số lượng các bộ bốn A[i,j], A[i+1,j], A[i, j+1], A[i+1, j+1] trong đó các phần tử đều khác nhau. Bài 4. Cho trước mảng 1 chiều. Chuyển các phần tử khác không về đầu dãy và các phần tử bằng không về cuối dãy mà vẫn giữ nguyên trật tự trước sau của các phần tử khác không. Không dùng 1 mảng phụ. Bài 5. Trong mảng A[1:n] (với n khá lớn) chỉ chứa các số 0, 1, 2. Hoán vị các phần tử sao cho đầu mảng chứa số 1, giữa mảng chứa số 2 và cuối mảng chứa số không. Không dùng 1 mảng phụ. Bài 6. Một mảng chứa N cặp số (ai, bi) tương ứng với N đường thẳng yi = aix + bi . Các đường thẳng được sắp xếp trong đoạn [0,1] trên trục x với ý nghĩa sau: yi < yi+1 với mọi giá trị i giữa 0 và N-2, và với mọi giá trị của x trên đoạn [0,1] Trình bày thuật toán và viết chương trình con để xác định nhanh 2 đường gần nhất “bao quanh” điểm P(xP, yP) cho trước với 0 ≤ xP ≤ 1 1
  • 2. Bài 7. Tìm các số tự nhiên lẻ có ba chữ số. Ba chữ số này theo trận tự viết từ trái sang phải tạo thành cấp số cộng. Bài 8. Tìm các số tự nhiên lẻ có ba chữ số. Ba chữ số này theo trận tự viết từ trái sang phải tạo thành cấp số nhân. Bài 9. Cho trước số tự nhiên n. Tìm tất cả các ước số nguyên tố khác nhau của nó. Bài 10. Viết chương trình liệt kê tất cả các số tự nhiên K thỏa mã đồng thời những điều kiện sau: a. K là số có 5 chữ số. b. K là số nguyên tố. c. Đảo ngược các chữ số trong K ta cũng nhận được một số nguyên tố. d. Tổng các chữ số của K cung là số nguyên tố. Kết quả ghi vào file ketqua.out có dạng như sau: dòng đầu tiên ghi số lượng số K tìm được, các dòng tiếp theo ghi các số K, mỗi dòng 5 số. Bài 11. Một ma trận vuông A chỉ có các phần tử thuộc đường chéo chính và hai đường chéo sát đường chéo chính là khác không (a[i,j]=0 nếu |i-j|>1). Ma trận A có dạng X X 0 0 0 X X X 0 0 0 X X X 0 0 0 X X X 0 0 0 X X Để tiết kiệm bộ nhớ ta chỉ lưu trữ các phần tử khác không bằng mảng 1 chiều. Viết hàm nhập, xuất, cộng hai ma trận dạng này. Bài 12. Viết chương trình tìm ma trận nghịch đảo và đánh giá độ phức tạp của chương trình. III. KỸ THUẬT ĐỆ QUY Bài 1. Cho dãy an như sau: a0 =1; a1=0; a2 =-1; an = 2an-1 – 3an-2 - an-3 (n>2) Viết chương trình tính số hạng thứ n của dãy bằng hai cách: a) Sử dụng kỹ thuật đệ qui. b) Không sử dụng kỹ thuật đệ qui. Bài 2. Liệt kê tất cả các dãy nhị phân chiều dài bằng n Bài 3. Liệt kê các hoán vị của tập X={1,…,n} Bài 4. Liệt kê các tổ hợp chặp m của tập X={1,…,n} Bài 5. Cho dãy gồm n số, tìm các dãy con có tổng bằng m. Bài 6. Cho dãy gồm n số, tìm các dãy con có k phần tử và có tổng bằng m. Bài 7. Cho dãy n số nguyên và một số k, xuất ra tất cả các dãy con giảm có k phần tử (dãy con có thể liên tiếp hoặc không liên tiếp và có thể có phần tử trùng). Ví dụ: dãy 5 2 4 3 1 có các dãy con 3 phần tử và giảm là: 5 2 1; 5 4 3; 5 4 1; 5 3 1; 4 3 1 2
  • 3. IV. STACK & QUEUE Bài 1. Viết chương trình đổi số thập phân sang cơ số b (2,8,16). Bài 2. Viết hàm tính giá trị của biểu thức dưới dạng hậu tố chỉ bao gồm: các dấu mở ngoặc/đóng ngoặc; 4 toán tử cộng, trừ, nhân và chia (+, -, *, /); các toán hạng đều chỉ là các con số nguyên từ 0 đến 9; không có bất kỳ khoảng trắng nào giữa các ký tự. Bài 3. Dùng dslk đơn có nút head để lưu trữ một tập hợp các số nguyên. a) Viết hàm xét một phần tử có thuộc tập hợp hay không? b) Viết các hàm tìm giao, hợp, hiệu hai tập hợp. c) Viết hàm xét một tập có là một tập con của một tập cho trước hay không? Bài 4. Tàu theo lối vào, vào xưởng sửa chữa, sửa xong ra theo lối ra. Biết rằng tàu vào sau sẽ được sửa trước. Ví dụ: có 4 đầu tàu xếp hàng sửa chữa theo thứ tự 1,2,3,4 ; nếu thực hiện các lệnh vào/ra theo thứ tự sau: VVRVVRRR thì thứ tự lúc ra là: 2, 4,3,1. Xét 6 đầu tàu xếp hàng sửa chữa theo thứ tự 1,2,3,4,5,6. Cho biết dãy lệnh vào/ra như thế nào để có thứ tự lúc ra là: a) 3,2,5,6,4,1 b) 1,5,4,6,3,2 Bài 5. Vũ trường ABC mỗi tối thứ bảy có tổ chức khiêu vũ cho các cặp nam-nữ. Cặp đầu tiên là người nam đến đầu tiên và người nữ đến đầu tiên, cặp thứ hai là người nam đến thứ hai và người nữ đến thứ hai, …. Hãy viết chương trình dùng hàng đợi, nhập những người đi dự buổi khiêu vũ (nhập tên và giới tính), sau đó xuất ra màn hình từng cặp khiêu vũ và các người còn dư. Bài 6. a. Dùng stack viết chương trình đổi số thập phân sang cơ số b (2,8,16). HD: vàora Xưởng sửa chữa 3 132162032112101011data0123 top Chia 13 cho 2 cho tới khi thương số bằng 0 thì ngừng. Các số dư cất vào stack, sau đó lấy ra, kết quả là: 1310 = 11012 .
  • 4. b. Dùng stack viết chương trình tháp Hà Nội không đệ qui: In ra các bước dời n đĩa từ A sang B, C trung gian. Yêu cầu là mỗi lần chỉ được dời một đĩa và không được để đĩa lớn trên đĩa nhỏ. HD: G/s dời 3 đĩa từ A sang B, C trung gian. Thứ tự dời đĩa: A->B, A->C, B->C, A->B, C->A, C->B, A->B B0: Cất (3,A,B,C) B1: Trong khi stack khác rỗng, lặp lại các bước sau: B1.1: lấy dl từ stack B1.2: nếu 1 đĩa thì xuất, ngược lại cất dl theo thứ tự: phải, giữa, trái Bài 7. Viết hàm tính chuỗi biểu thức chỉ bao gồm: các dấu mở ngoặc/đóng ngoặc; 4 toán tử cộng, trừ, nhân và chia (+, -, *, /); các toán hạng đều chỉ là các con số nguyên từ 0 đến 9; không có bất kỳ khoảng trắng nào giữa các ký tự. HD: Các toán tử được đặt giữa hai toán hạng gọi là biểu thức trung tố (infix), nếu đặt sau các toán hạng gọi là biểu thức hậu tố (postfix). Biểu thức hậu tố không cần ngoặc và máy tính dễ dàng tính được giá trị của biểu thức hậu tố. * Thuật toán tính giá trị biểu thức hậu tố: Đọc biểu thức từ trái sang phải, nếu gặp một toán hạng (con số hoặc biến) thì push toán hạng này vào ngăn xếp; nếu gặp toán tử, lấy hai toán hạng ra khỏi ngăn xếp (stack), tính kết quả, đẩy kết quả trở lại ngăn xếp. Khi quá trình kết thúc thì con số cuối cùng còn lại trong ngăn xếp chính là giá trị của biểu thức đó. Ví dụ: biểu thức trung tố : 5 + ((1 + 2) * 4) + 3 được biểu diễn lại dưới dạng hậu tố là (ta sẽ bàn về thuật toán chuyển đổi từ trung tố sang hậu tố sau): 5 1 2 + 4 * + 3 + Quá trình tính toán sẽ diễn ra theo như bảng dưới đây: Ký tự Thao tác Trạng thái stack (1,A,B,C)(1,A,C,B)(2,A,C,B)(1,B,C,A)(1,C,A,B)(1,A,B,C)(1,A,B,C)(1,C,B,A) (3,A,B,C)(2,C,B,A)(2,C,B,A)(1,A,B,C)RỖNG 4 (3,A,B,C) (2,A,C,B) (2,C,B,A)(1,A,B,C) (1,A,B,C) (1,A,C,B) (1,B,C,A) (1,C,A,B) (1,C,B,A) (1,A,B,C)
  • 5. 5 Push 5 5 1 Push 1 5, 1 2 Push 2 5, 1, 2 + Tính 1 + 2 Push 3 5, 3 4 Push 4 5, 3, 4 * Tính 3 * 4 Push 12 5, 12 + Tính 12 + 5 Push 17 17 3 Push 3 17, 3 + Tính 17 + 3 Push 20 20 * Thuật toán chuyển đổi biểu thức trung tố sang hậu tố Duyệt biểu thức từ trái sang phải: + Nếu gặp một toán hạng (con số hoặc biến) thì ghi nó vào chuỗi kết quả (chuỗi kết quả là biểu thức hậu tố). + Nếu gặp dấu mở ngoặc, đưa nó vào stack. + Nếu gặp một toán tử (gọi là o1 ), thực hiện hai bước sau: - Chừng nào còn có một toán tử o2 ở đỉnh ngăn xếp và độ ưu tiên của o1 nhỏ hơn hay bằng độ ưu tiên của o2 thì lấy o2 ra khỏi ngăn xếp và ghi vào kết quả (ngoặc trái có độ ưu tiên thấp nhất). - Push o1 vào ngăn xếp + Nếu gặp dấu đóng ngoặc thì cứ lấy các toán tử trong ngăn xếp ra và ghi vào kết quả cho đến khi lấy được dấu mở ngoặc ra khỏi ngăn xếp. + Khi đã duyệt hết biểu thức trung tố, lần lượt lấy tất cả toán hạng (nếu có) từ ngăn xếp ra và ghi vào chuỗi kết quả. ví dụ : Biểu thức cần chuyển đổi: 3+4*2/(1-5) Ký tự Thao tác Stack Chuỗi hậu tố 3 Ghi 3 vào k.quả 3 + Push + + 4 Ghi 4 vào k.quả 3 4 * Push * + * 2 Ghi 2 vào kquả 3 4 2 / Lấy * ra khỏi stack, ghi vào k.quả, push / + / 3 4 2 * ( Push ( + / ( 3 4 2 * 1 Ghi 1 vào k.quả + / ( 3 4 2 * 1 - Push - + / ( - 3 4 2 * 1 5 Ghi 5 vào k.quả + / ( - 3 4 2 * 1 5 ) Pop cho đến khi lấy được (, ghi các toán tử pop được ra k.quả + / 3 4 2 * 1 5 - Pop tất cả các toán tử ra khỏi ngăn xếp và ghi vào kết quả 3 4 2 * 1 5 – / + 5
  • 6. Thuật toán được trình bày ở đây là khá đơn giản và chưa ứng dụng được trong trường hợp biểu thức có các hàm như sin, cos,… hoặc có các biến. Tuy nhiên, việc mở rộng thuật toán là hoàn toàn có thể. Bài 8. G/s chương trình cần sử dụng nhiều stack, nếu sử dụng nhiều cấu trúc stack riêng lẻ thì sẽ không tận dụng được bộ nhớ của nhau. Ví dụ stack 1 còn nhiều bộ nhớ, stack 2 hết bộ nhớ, nhưng lại không thể sử dụng bộ nhớ của stack 1. Để giải quyết vấn đề, hãy xây dựng các cấu trúc sau: a) Xây dựng cấu trúc có 2 stack và các phép toán cơ bản trên cấu trúc này b) Xây dựng cấu trúc có n stack và các phép toán cơ bản trên cấu trúc này HD: a) 2 stack: Để hai stack ở hai đầu, hướng phát triển ngược nhau, đáy stack cố định b) n stack (n>2): ban đầu chia đều bộ nhớ cho n stack. Nếu có một stack hết chỗ thì đẩy stack sau sang phải hoặc dời chính stack đó sang trái, khi đó đáy stack di chuyển. V. DANH SÁCH LIÊN KẾT Bài 1. Viết chương trình tạo một menu thực hiện các công việc sau: a. Nhập danh sách liên kết theo giải thuật thêm về cuối danh sách, mỗi phần tử gồm có các thông tin sau: mã sinh viên(int), và họ tên sinh viên (char[30]) b. Liệt kê danh sách ra màn hình c. Cho biết tổng số nút trong danh sách liên kết. d. Thêm 1 phần tử vào sau phần tử có thứ tự thứ i trong danh sách. e. In ra họ tên của sinh viên có mã do ta nhập vào. f. Loại bỏ nút có mã do ta nhập vào, trước khi xóa hỏi lại "Bạn có muốn xóa (Y/N)?" g. Sắp xếp lại danh sách theo thứ tự mã số giảm dần h. Ghi toàn bộ danh sách vào file tên "DSSV.DAT" i. Nạp danh sách từ file "DSSV.DAT" vào danh sách liên kết. Nếu trong danh sách liên kết đã có nút thì xóa tất cả dữ liệu hiện có trong danh sách liên kết trước khi đưa dữ liệu từ file vào. Bài 2. Viết chương trình tạo một danh sách liên kết theo giải thuật thêm vào đầu danh sách, mỗi nút chứa một số nguyên. Bài 3. Viết hàm xóa một nút có địa chỉ p. Bài 4. Viết hàm copy_list trên danh sách liên kết để tạo ra một danh sách liên kết mới gống danh sách liên kết cũ. 31597826 đáy stack 1 đỉnh stack 1 đỉnh stack 2 đáy stack 2 428317596 đáy stack 1 đỉnh stack 1 đáy stack 2 đỉnh stack 2 đáy stack 3 đỉnh stack 3 6
  • 7. Bài 5. Ghép một danh sách liên kết có địa chỉ đầu là First vào một danh sách liên kết có địa chỉ đầu là First1 ngay sau phần tử thứ I trong danh sách liên kết first1. Bài 6. Viết hàm lọc danh sách liên kết để tránh trường hợp các nút trong danh sách liên kết bị trùng info Bài 7. Đảo ngược vùng liên kết của một danh sách liên kết sao cho: - First sẽ chỉ đến phần tử cuối - Phần tử đầu có liên kết là NULL Bài 8. Viết hàm Left_Traverse(NODE first) để duyện ngược danh sách liên kết. Bài 9. Viết giải thuật tách một danh sách liên kết thành hai danh sách liên kết, trong đó một danh sách liên kết của phần tử có số thứ tự lẽ và một danh sách liên kết chứa các phần tử có số thứ tự chẵn trong danh sách liên kết cũ. Bài 10. Tạo một danh sách liên kết chứa tên học viên, điểm trung bình, hạng của học viên (với điều kiện chỉ nhập tên và điểm trung bình). Quá trình nhập sẽ dừng lại khi tên nhập vào là rỗng. Xếp hạng cho các học viên. In ra danh sách học viên thứ tự hạng tăng dần(Ghi chú: Cùng điểm trung bình thì cùng hạng). Bài 11. Nhập hai đa thức theo danh sách liên kết. In ra tích của hai đa thức này. Ví dụ: Đa thức First1: 2x5 +4x2 -1 Đa thức First1: 10x7 -3x4 +3x2 Kết quả in ra là 20x12 +34x9 -8x7 -12x6 +7x4 -x2 Bài 12. Viết giải thuật thêm phần tử có nội dung x vào danh sách liên kết có thứ tự tăng dần sao cho sau khi them danh sách liên kết vẫn có thứ tự tăng dần. Bài 13. Cài đặt cấu trúc dslk đơn có nút head và các hàm xử lý cơ bản Bài 14. Cài đặt cấu trúc dslk đơn có vòng và các hàm xử lý cơ bản Bài 15. Cài đặt cấu trúc dslk đơn có nút head+vòng và các hàm xử lý cơ bản Bài 16. Cài đặt cấu trúc stack bằng dslk đơn và các hàm xử lý cơ bản trên satck Bài 17. Cài đặt cấu trúc queue bằng dslk đơn và các hàm xử lý cơ bản trên queue. Bài 18. Dùng dslk đơn lưu trữ đa thức P(x) = anxn + an-1xn-1 + …+ a1x1 + a0x0 . Biết rằng mỗi nút chứa dữ liệu là hệ số và số mũ của một số hạng. a) Viết hàm tính giá trị đa thức khi biết x. b) Viết hàm cộng, trừ, nhân, chia hai đa thức. c) Viết hàm tính đạo hàm, tích phân một đa thức. Hướng dẫn: 23 -12 50P NULL 12 51 -40Q NULL 23 51 10R NULL p r q 7
  • 8. P(x)= 2x3 –x2 +5 Q(x)= x2 +5x-4 R(x)=P(x)+Q(x)=2x3 +5x+1 + Sắp xếp dslk P, Q theo số mũ giảm dần + Cộng dồn những nút có cùng số mũ trên P (Q), bỏ những nút có hệ số = 0 + Dùng 2 biến p,q trỏ tới nút đang xét trên P,Q và biến r trỏ tới nút cuối của R. Khởi đầu p=P, q=Q, R = r = NULL - Nếu mũ p> mũ q thì chép nút p vào R, tăng p, tăng r - Nếu mũ p< mũ q thì chép nút q vào R, tăng q, tăng r - Nếu mũ p= mũ q thì cộng hs p và hs q. Nếu tổng khác 0 thì tạo nút tổng gắn vào R, tăng p,q, r. tổng bằng =0 thì chỉ tăng p,q. Lặp lại việc so sánh số mũ, cho tới khi p=NULL hoặc q=NULL. Sau đó chép các nút còn lại của P hoặc Q vào R Bài 19. Dùng dslk đơn có nút head để lưu trữ một tập hợp các số nguyên. a) Viết hàm xét một phần tử có thuộc tập hợp hay không? b) Viết các hàm tìm giao, hợp, hiệu hai tập hợp. c) Viết hàm xét một tập có là một tập con của một tập cho trước hay không? HD: A={2,5}lưu trữ dạng sau: Bài 20. Có thể dùng một mảng để cài đặt nhiều cấu trúc danh sách liên kết: Mỗi phần tử của mảng là một nút gồm hai thành phần (data,next), next là chỉ số của phần tử tiếp theo, nếu next=-1 thì đó là phần tử cuối của một ds. Hãy cài đặt các phép toán cơ bản trên dslk loại này. Ví dụ: giả sử dùng mảng 10 phần tử và có 3 ds: list 1, list 2, và ds các nút trống (empty) 2 5A NULL HEAD list2 list1 012345678942-1956788-12912-141 empty 67list2 =3 12 95 3 7 2 8-1 5 29list1 =6 41 2-1 6 9 1 4empty =0 8 -1 0 4 8 8
  • 9. Bài 21. Ban đầu ds empty là 10 nút, nút đầu là nút 0, nút kế là nút 1,…, nút cuối là nút 9. Nút được chọn để cấp phát là nút đầu ds empty, khi hủy một nút thì thêm nút đó vào đầu ds empty. Bài 22. Viết chương trình chọn phò mã theo giải thuật Josephus: Cho n hoàng tử xếp hàng ngang, đánh số các hoàng tử từ 1->n, loại hoàng tử cách hoàng tử đầu hàng k vị trí (k là một số ngẫu nhiên được chọn trước), nếu k lớn hơn số hoàng tử còn lại thì đếm vòng lên đầu. Lặp lại việc loại cho đến khi chỉ còn 1 hoàng tử và đó là phò mã. Hướng dẫn: Dùng dslk vòng, hủy phần tử thứ k, cho đến khi ds chỉ còn 1 phần tử. Ví dụ: có 5 hoàng tử, k=3 xếp hàng và đánh số: 1 2 3 4 5 loại 4: 1 2 3 5 loai 5: 1 2 3 loại 1: 2 3 loại 3: 2 2 là phò mã Bài 23. Viết chương trình tự điển Anh-Việt có các chức năng sau: a) Nhập, xem, xoá, sửa từ b) Tra từ: nhập tiếng Anh hiện nghĩa tiếng Việt. c) Hiện toàn bộ tự điển theo thứ tự Alphabet Yêu cầu là tự điển lưu trữ theo cấu trúc sau: Hướng dẫn: Tự điển lưu trữ bằng 26 dslk đơn, dslk thứ 0 lưu trữ vần a,…, slk thứ 25 lưu trữ vần z. Mỗi ds luôn có thứ tự theo Alphabet. Bài 24. Xét ma trận thưa, trong ma trận chỉ có một số ít phần tử khác không. Để tiết kiệm bộ nhớ khi lưu trữ ma trận này, ta có thể tổ chức như sau: 0 1 2 3 4 0 0 0 0 5 9 1 0 0 0 0 0 2 0 0 8 0 0 3 0 0 0 0 0 4 0 2 0 4 0 Dslk thứ 0 có phần tử (3,5) nghĩa là: hàng 0, cột 3 có số 5 Viết hàm cộng, trừ, nhân hai ma trận theo cách lưu trữ này. 012…25 amột andvà beecon ong bookquyển sách zoosở thú 01234 3,5 4,9 2,8 1,2 3,4 9
  • 10. Bài 25. Viết chương trình quản lý, điều hành tuyến xa lửa, dùng dslk kép+head+vòng. Chương trình có các chức năng sau: a) Thêm, xem, hiệu chỉnh, hủy một đoạn đường sắt. Đoạn đường sắt có thông tin là: ga đầu, ga cuối, chiều dài đoạn đường, thời gian xe lửa chạy trên đoạn đường đó. b) Xem toàn tuyến đường sắt đi xuôi, tuyến đường sắt đi ngược. Tuyến đường sắt gồm nhiều đoạn đường sắt. c) Xem một lộ trình: nhập nơi đi, nơi đến, cho biết các ga trung gian, tổng chiều dài, tổng thời gian của lộ trình. Bài 26. Viết hàm cộng, trừ, nhân, chia hai số nguyên lớn bất kỳ theo cách lưu trữ sau: ví dụ A = 8.041.009.000.105 chia thành 5 nhóm, mỗi nhóm 3 chữ số, lưu trữ vào một nút của dslk kép+head+vòng Bài 27. Viết chương trình xử lý đơn khiếu nại. Đơn khiếu nại nào có độ ưu tiên cao hơn sẽ được giải quyết trước. Nếu các đơn có độ ưu tiên bằng nhau thì đơn nào đến trước sẽ được giải quyết trước. Chương trình có các chức năng sau: a. Nhận đơn: nhập tên đơn, độ ưu tiên, thông báo nếu đầy đơn (không nhận đơn nữa). b. Giải quyết đơn: in ra màn hình tên đơn phải giải quyết, thông báo nếu hết đơn. c. Xem các đơn: in ra màn hình các đơn cần xử lý theo thứ tự ưu tiên. Bài 28. Trong dslk đơn chuẩn a) Viết hàm chèn vào trước một nút khác (chèn dữ liệu x vào trước nút có đ/c là q) b) Viết hàm hủy nút p. c) Viết hàm hủy những nút trùng dữ liệu (nhưng nút trùng dữ liệu chỉ giữ lại một nút) HD: a) chèn sau rồi hoán vị. b) hoán vị p và nút sau p, sau đó hủy sau p. Bài 29. Trong dslk đơn chuẩn a) Viết hàm tìm địa chỉ của nút thứ i trong ds (i=0,1,…) b) Viết hàm tìm vị trí của nút có đ/c biết trước trong ds (vị trí tính từ 0) c) Viết hàm tìm đ/c của nút ngay trước nút p d) Viết hàm đếm số nút trong ds VI. CÂY NHỊ PHÂN Bài 1. Cây nhị phân cân bằng hoàn toàn là cây nhị phân mà tương ứng với tất cả các nút thì số nút của cây con bên trái và số nút của cây con bên phải chênh lệch nhau không quá 1. Cho cây nhị phân tìm kiếm có con trỏ đầu tree chỉ đến gốc của cây với khai báo như sau: struct node { int key; int info ; struct node *left; head 8 41 9A 0 105 10
  • 11. struct node *right; } ; typedef struct node *PTR; PTR tree; a. Hãy viết chương trình con xác định xem cây nhị phân tree có phải là cây nhị phân tìm kiếm cân bằng hoàn toàn hay không? b. Hãy viết hàm trả về mức của nút có khóa key = X, với X là số nguyên dương và giả sử rằng nút gốc có mức bằng 1. Ghi chú là trong trường hợp cây tree không có nút với khóa X thì hàm sẽ trả về 0. Bài 2. Trên cây nhị phân tìm kiếm (BST) với dữ liệu ở các nút là số nguyên, hãy viết các hàm sau: a) Đếm số nút và số nút lá trên cây. b) Tìm so lớn nhất, so nho nhat trên cây, tính giá trị trung bình của các so trên cây. c) Tính chiều cao của cây. d) Kiểm tra cây nhị phân có phải cây AVL không? Bài 3. Viết chương trình tạo một menu thực hiện các mục sau: a. Tạo cây nhị phân tìm kiếm với nội dung là số nguyên(không trùng nhau) b. Liệt kê cây nhị phân ra màn hình theo thứ tự NLR c. Đếm tổng số nút, số nút lá, và số nút trung gian của cây. d. Tính độ cao của cây. e. Loại bỏ nút có nội dung là x trong cây nhị phân BST. f. Thêm nút có nội dung x vào cây nhị phân BST sao cho sau khi thêm thì cây vẫn là BST. g. Vẽ cây nhị phân ra màn hình. Bài 4. Cho một cây nhị phân tree, hãy viết chương trình để sao chép nó thành cây mới tree2, với khóa, nội dung, và liên kết giống như cây tree. Bài 5. Viết các hàm kiểm tra xem cây nhị phân a. Có phải là cây nhị phân đúng không. b. Có phải là cây nhị phân đầy không. Bài 6. Viết hàm kiểm tra nút x và y có trên cây hay không, nếu có cả x và y trên cây thì xác định nút gốc của cây con nhỏ nhất có chứa x và y. Bài 7. Hãy trình bày cách chuyển một biểu thức số học sang cây biểu thức. Vẽ cây biểu thức của biểu thức số học sau: (10+5)^2/(52*4-3) Bài 8. Cho một cây biểu thức, hãy viết hàm Calculate(NODE root) để tính giá trị của cây biểu thức đó biết rằng các toán tử được dùng trong biểu là: + - * / ^ % ! Bài 9. Chứng minh: 11
  • 12. a/ Nếu số nút của cây nhị phân gần đầy là lẻ thì cây này cũng là cây nhị phân đúng. Nếu số nút của cây nhị phân gần đầy là chẵn thì cây này không là cây nhị phân đúng. b/ Nếu cây nhị phân đúng có n nút lá thì sẽ có 2n-1 nút. c/ Nếu cây nhị phân không đúng và gần đầy có n nút lá thì sẽ có 2n nút. Bài 10. Cài đặt các cách duyệt cây NLR, LNR, LRN không sử dụng kỹ thuật đệ qui. HD: * Duyệt NLR: + Cắt gốc vào stack + Trong khi stack còn khác rỗng thi thực hiện các lệnh sau: - Lấy p ở đỉnh stack, in p->data - Nếu p có con phải/trái thì cắt con phải/trái vào stack * Duyệt LNR: + p=root + Trong khi p còn khác NULL thì cắt p vào stack và gán p=p->left + Trong khi stack còn khác rỗng thực hiện các lệnh sau: - lay p tu dinh stack, in p->data, - neu p co con phai thi goi q la con phai va trong khi q con khac NULL thi cat q vao stack va gan q=q->left * Duyet LRN: 55 20 32 65 35 35 35 * 60 * 30 * 30 * 30 * 80 70 70 70 70 * 50 50 50 50 // mot nut khi cat cac nut con vao stack thi gan flag=1 de tb cac con trai/phai cua no da duoc duyet + ban dau gan tat cac nut co flag=0, 2032553030356065505050707 08020,30,32,35,50,55,60,65,70 ,80 50 30 70 60 80 55 65 35 32 20 12
  • 13. + cat root vao stack + trong khi stack con khac rong thuc hien cac buoc sau : - goi p la phan tu dinh stack - neu p khong co con hoac co cua p=1 thi lay p ra khoi stack, xuat p->data nguoc lai cat con phai va/hoac con trai neu co cua p vao stack va gan co cua p=1 Bài 11. Cây nhị phân đầy hoặc gần đầy có thể cài đặt bằng mảng: mỗi nút là một phần tử của mảng, nút gốc lưu ở phần tử 0 của mảng, nếu nút cha lưu ở phần tử thứ i của mảng thì nút con bên trái lưu ở phần tử 2i+1 và nút con bên phải lưu ở phần tử 2i+2. Với cây nhị phân bất kỳ, có thể thêm vào các nút gỉa để chuyển về cây gần đầy (nút gỉa có thể gây lãng phí bộ nhớ). Hãy viết các hàm cơ bản trên cấu trúc cây cài đặt bằng mảng như trên. Hướng dẫn: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 50 30 70 60 80 55 65 Bài 12. Cài đặt cây cân bằng AVL (Adelson Velski &Landis) với các hàm cơ bản Bài 13. Viết hàm tạo cây, duyệt cây nhị phân tìm kiếm theo chiều rộng HD: Cây nhị phân tìm kiếm là cây mà mỗi nút có tối đa hai con, trong đó con trái nhỏ hơn nút,s con phải lớn hơn nút. - Khai báo cấu trúc một nút struct node { int data; node * left,*right; }; node *root;//dc goc cay - Nhập cây: nút nhỏ bên trái, nút lớn bên phải - In Cây: dùng queue B1: cất root vào queue B2: trong khi queue còn khác rỗng thực hiện các bước sau: 50 30 70 604020 80 0 1 2 3 4 5 6 50 30 70 60 80 55 65 50 30 70 60 80 0 1 2 3 4 5 6 55 657 8 9 10 11 12 13 0 1 2 3 4 5 6 50 30 70 20 40 60 80
  • 14. B2.1: Lấy node trong queue và in data của node B2.2: Cất con trái, con phải nếu có của node vào queue - Cất 5 - Lấy 5, in 5 - Cất con của 5 là 2, 9 vào queue - Lấy 2, in 2 - Cất con của 2 là 1, 3 vào queue - Lấy 9, in 9 - Cất con của 9 là 6, 12 vào queue - Lấy 1, in 1, 1 không có con nên không cất con của 1 - vv… Bài 14. Trên cây nhị phân tìm kiếm (BST) với dữ liệu ở các nút là số nguyên, hãy viết các hàm sau: a) Đếm số nút và số nút lá trên cây. b) Tìm so lớn nhất, so nho nhat trên cây, tính giá trị trung bình của các so trên cây. c) Tính chiều cao của cây. d) Duyệt cây theo mức từ mức thấp đến mức cao, mỗi mức duyệt từ trái qua phải. e) In cây ở dạng hình cây. f) Xoay cây: tại mỗi nút có cây con trái thành cây con phải và ngược lại VII. ĐỒ THỊ Bài 1. Cho đồ thị vô hướng được lưu trữ trong file văn bản dothi.in theo khuôn dạng sau: - Dòng đầu tiên ghi số đỉnh của đồ thị - Mỗi dòng kế tiếp ghi hai đỉnh của một cạnh đồ thị, hai đỉnh được ghi cách nhau một hoặc vài ký tự trống. Viết chương trình kiểm tra tính liên thông của đồ thị, kết quả được ghi trong file văn bản ketqua.out theo khuôn dạng như sau: - Dòng thứ nhất ghi : đồ thị liên thông hoặc đồ thị không liên thông - Nếu đồ thị không liên thông thì mỗi dòng tiếp theo ghi các đỉnh của một thành phần liên thông. Bài 2. Cho đồ thị vô hướng G có n đỉnh với các đỉnh được đánh số từ 1 đến n theo cấu trúc ma trận kề sau đây: const MAX = 50; // Số đỉnh tối đa của đồ thị typedef int Dothi[MAX][MAX] ; Dothi G ; 0123456752991313612361261212Kết quả in ra: 5, 2, 9, 1, 3, 6, 12 14
  • 15. int n; // số đỉnh của đồ thị G Hãy viết chương trình con để xác định đồ thị G có đường đi từ đỉnh u đến đỉnh v hay không? Bài 3. Cho đồ thị vô hướng G được biểu diễn dưới dạng danh sách kề trong file dske.in theo khuôn dạng: • Dòng đầu tiên ghi lại số tự nhiên N là số đỉnh của đồ thị. • N dòng kế tiếp mỗi dòng ghi lại danh sách kề của đỉnh tương ứng, hai đỉnh trong cùng một danh sách kề được ghi cách nhau một hoặc vài kí tự trống, đỉnh không có cạnh nối với nó (đỉnh cô lập) được ghi giá trị 0 hoặc là dòng trống. Hãy viết chương trình thực hiện việc kiểm tra và đưa ra thông báo tính liên thông của G như sau. Nếu G không liên thông thì thông báo ”G không liên thông”. Nếu G liên thông thì kiểm tra tiếp xem G có chu trình Euler hay không, nếu có thì thông báo “G là đồ thị Euler”. Nếu G không có chu trình Euler thì kiểm tra tiếp xem G có đường đi Euler hay không, nếu có thì thông báo “G là đồ thị nửa Euler”, ngược lại thông báo “G không là đồ thị nửa- Euler”. Ví dụ với đồ thị 4 đỉnh được cho trong file dske.in dưới đây sẽ cho ta kết quả “G là đồ thị Euler”. dske.in 4 2 3 1 4 1 4 3 2 Bài 4. Cho đồ thị vô hướng G =<V,E> gồm N đỉnh và M cạnh được biểu diễn dưới dạng danh sách kề trong file dske.in theo khuôn dạng sau: • Dòng đầu tiên ghi lại số tự nhiên N là số đỉnh của đồ thị; • N dòng kế tiếp, mỗi dòng thứ i (i=1,…,N) ghi lại danh sách các đỉnh kề với đỉnh thứ i. Hai đỉnh trong cùng một danh sách kề được phân biệt với nhau bằng một hoặc vài kí tự trống. Dòng thứ i sẽ ghi số 0 nếu đỉnh i không có đỉnh kề. Hãy viết chương trình chuyển đổi biểu diễn đồ thị G dưới dạng danh sách kề như trên thành biểu diễn của đồ thị G dưới dạng ma trận kề và danh sách cạnh. Khuôn dạng biểu diễn đồ thị G dưới dạng ma trận kề, danh sách kề được ghi lại trong file mtke.out và dscanh.out theo khuôn dạng sau: + Khuôn dạng file mtke.out: • Dòng đầu tiên ghi lại số tự nhiên N là số đỉnh của đồ thị; • N dòng kế tiếp ghi lại ma trận kề của đồ thị, hai phần tử khác nhau của ma trận kề được ghi cách nhau bởi một vài ký tự trống. + Khuôn dạng file dscanh.out: • Dòng đầu tiên ghi lại số tự nhiên N và M tương ứng với số đỉnh và số cạnh của đồ thị, hai số được ghi cách nhau bởi một vài ký tự trống; 15
  • 16. • M dòng kế tiếp mỗi dòng ghi lại một cạnh của đồ thị, đỉnh đầu và đỉnh cuối của mỗi cạnh được ghi cách nhau bởi một vài ký tự trống. Ví dụ đồ thị gồm 5 đỉnh, 5 cạnh được biểu diễn trong file dske.in như dưới đây sẽ cho ta các file mtke.out và dscanh.out tương ứng. dske.in mtke.out dscanh.out 5 5 5 4 2 3 0 1 1 0 0 1 2 1 4 1 0 0 1 0 1 3 1 5 1 0 0 0 1 2 4 2 0 1 0 0 0 3 5 3 0 0 1 0 0 Chú ý: làm bài tập tương tự cho đồ thị có hướng. Bài 5. Cho đồ thị có hướng được lưu trữ trong file văn bản duongdi.in theo khuôn dạng sau: - Dòng đầu tiên ghi số đỉnh và đỉnh xuất phát s. - Mỗi dòng kế tiếp ghi đỉnh đầu, đỉnh cuối và trọng số của một cung. Viết chương trình tìm đuờng đi ngắn nhất từ đỉnh s đến tất cả các đỉnh còn lại, kết quả được ghi trong file văn bản duongdi.out, mỗi dòng ghi một đường đi. ví dụ: file duongdi.in 6 1 1 2 1 2 3 5 2 4 2 2 6 7 3 6 1 4 3 1 4 1 2 4 5 4 5 4 3 6 5 1 file duongdi.out Duong di tu 1 den 2 la:1->2 Duong di tu 1 den 3 la:1->2->4->3 Duong di tu 1 den 4 la:1->2->4 Duong di tu 1 den 5 la:1->2->4->3->6->5 Duong di tu 1 den 6 la:1->2->4->3->6 16
  • 17. VIII.SẮP XẾP VÀ TÌM KIẾM 17
  • 18. IX. MỘT SỐ BÀI TOÁN CĂN BẢN Bài 1. Giả sử bảng điểm có dạng sau. Mã sinh viên Môn 1 Môn 2 Môn 3 sv1 6 9 7 sv2 5 2 8 vv… 1/ Hãy xây dựng giải thuật nhập điểm của n sinh viên và giải thuật in bảng điểm trong hai trường hợp sau: a) Dùng CTDL để lưu trữ bảng điểm là mảng 1 chiều: điểm của sv1 lưu vào 3 vị trí đầu mảng, 3 vị trí tiếp theo lưu điểm của sv2, vv… b) Dùng CTDL để lưu trữ bảng điểm là mảng 2 chiều (n hàng, 3 cột): hàng i lưu điểm sv thứ i, cột j lưu điểm môn j. 2/ Cho nhận xét về hai CTDL trên Bài 2. Xây dựng giải thuật và đánh giá giải thuật đoán số như sau: người sử dụng nghĩ một số từ 1 đến 100, máy sẽ đoán tối đa 7 lần sẽ đoán trúng. Bài 3. Xét hệ phương trình tuyến tính có dạng a11x1 = b1 a21x1 + a22x2 = b2 an1xn + an2x2 +…+ annxn = bn (aij khac 0) Để tiết kiệm bộ nhớ ta chỉ lưu trữ các hệ số của ma trận bằng mảng 1 chiều. Viết chương trình giải hệ phương trình này với cách lưu trữ như trên. Bài 4. Xét đa thức p(x)= anxn + an-1xn-1 +…+ a0. 1/ Nếu lưu trữ đa thức bằng một mảng một chiều theo dạng (n, an, an-1,…, a0) thì có ưu nhược điểm gì? 2/ Hãy đề xuất một cách lưu trữ khác mà theo bạn là tốt hơn. 3/ Viết chương trình cộng, trừ, nhân, chia hai đa thức với cách lưu trữ như câu 2. Bài 5. Viết chương trình giải hệ phương trình tuyến tính (n phương trình, n ẩn số) và đánh giá độ phức tạp của chương trình. Bài 6. Cho dãy an như sau: a0 =1; a1=0; a2 =-1; an = 2an-1 – 3an-2 - an-3 (n>2) Viết chương trình tính số hạng thứ n của dãy bằng hai cách: a) Sử dụng kỹ thuật đệ qui. b) Không sử dụng kỹ thuật đệ qui. 18
  • 19. Bài 7. Liệt kê các cách xếp n con hậu vào bàn cờ kích thứơc n x n sao cho không ăn lẫn nhau. Bài 8. Cho dãy gồm n số, tìm các dãy con có tổng bằng m. Bài 9. Cho dãy gồm n số, tìm các dãy con có k phần tử và có tổng bằng m. Bài 10. Tam giác thần bí bậc n là tam giác vuông cân, mỗi cạnh có n phần tử là các số tự nhiên từ 1 đến 3n-3 và không trùng nhau, thoả tính chất tổng các phần tử trên mỗi cạnh đều có cùng giá trị . ví dụ :đây là một tam giác thần bí bậc n=5 vì có tổng các phần tử trên mỗi cạnh bằng nhau (bằng 35). 12 11 2 6 4 1 7 5 9 8 3 10 a) Viết hàm kiểm tra một tam giác vuông cân với các phần tử là các số tự nhiên từ 1 đến 3n-3 có là tam giác thần bí bậc n hay không? nếu là tam giác thần bí trả về 1 ngược lại trả về 0. Biết rằng để tiết kiệm bộ nhớ, tam gíac được lưu trong mảng 1 chiều. Ví dụ tam gíac như trên lưu trữ như sau: 12 11 6 1 5 9 8 3 10 7 4 2 b) Viết hàm liệt kê tất cả các tam giác thần bí bậc n. Bài 11. Hình vuông thần bí bậc n là một ma trận kích thước n x n, gồm các phần tử từ 1 đến n2 không trùng nhau, sao cho tổng mỗi dòng, mỗi cột, mỗi đường chéo đều bằng nhau. Ví dụ một hình vuông thần bí bậc 3 là: 2 7 6 9 5 1 4 3 8 Viết chương trình liệt kê tất cả các hình vuông thần bí bậc n. Bài 12. Liệt kê tất cả các cách ghi N thành tổng các số nguyên dương. Ví dụ N=5, tách N thành 1 số, 2 số, 3 số, 4 số, 5 số như sau: 5, 1+4, 2+3, 1+1+3, 1+2+2, 1+1+1+2, 1+1+1+1+1 Bài 13. Cho dãy n số nguyên và một số k, xuất ra tất cả các dãy con giảm có k phần tử (dãy con có thể liên tiếp hoặc không liên tiếp và có thể có phần tử trùng). Ví dụ: dãy 5 2 4 3 1 có các dãy con 3 phần tử và giảm là: 5 2 1; 5 4 3; 5 4 1; 5 3 1; 4 3 1 Bài 14. Cho dãy n số nguyên, xuất ra dãy con tăng dài nhất (dãy con có thể liên tiếp hoặc không liên tiếp và có thể có phần tử trùng). Nếu có nhiều dãy con tăng dài bằng nhau thì chỉ xuất ra một dãy. Ví dụ: dãy 7, 3, 2, 4, 1, 6, 5, 8 có dãy con tăng dài nhất là: 3, 4, 6, 8 có chiều dài là 4 Bài 15. Tìm tất cả các nghiệm nguyên không âm của phương trình sau: a1x1 +a2x2 +…anxn = b (ai duong, bi la các số nguyên không âm) Ví dụ: phương trình: x1+2x2+3x3=20 (n=3,b=20, a1=1, a2=2, a3=3) 19
  • 20. có 44 nghiệm là: x=(0,1,6),.., x=(2,2,4),...,x=(20,0,0) X. BÀI TẬP CÓ BÀI GIẢI Bài 1. Chứng tỏ rằng chương trình sử dụng các lệnh if, if..else, switch, for, while, do.. while đều có thể chuyển đổi thành chương trình chỉ sử dụng lệnh while. Bài 2. Hãy chuyển đổi chương trình sau đây thành chương trình chỉ sử dụng lệnh while và hãy cho biết kết quả sau khi chương trình thực hiện: #include <stdio.h> #include <conio.h> #include <string.h> void main(void) { clrscr(); int n, m=0, k=0;n = strlen(str);char s[32]; for(int i=0; i<=n; i++){ switch(str[i]){ case ' ' : case 't': case 'n': case 'r': case '0': if (k>0) { s[k]='0';m++;k=0; printf("n Kết quả bước %d:%s",m,s); } break; default: s[k++]=str[i]; break; } } } Bài giải: 3 Bài 3. Viết chương trình tìm giá trị tối ưu fopt = f(x1,x2,..,xn) và phương án tối ưu xopt = (x1, x2,..,xn) của hàm mục tiêu ∑= = n i iin xcxxxf 1 21 ;),..,,( Trong đó ( ) ( ) { }       ∈≤=∈ ∑= n i jiinn xbxaxxxDxxx 1 2121 ;1,0;:,..,,,..,, ; cj, aj, b là các số nguyên dương (j=1,2,..,n). Dữ liệu vào n, b, cj, aj được cho trong file Data.in theo khuôn dạng sau: • Dòng đầu tiên ghi lại hai số tự nhiên n và b, hai số được viết cách nhau bởi một hoặc vài kí tự trống. 20
  • 21. • Dòng kế tiếp ghi lại n số nguyên dương c1, c2, .., cn. ; các số được viết cách nhau bởi một hoặc vài kí tự trống. • Dòng cuối cùng ghi lại n số nguyên dương a1, a2,..,an; các số được viết cách nhau bởi một hoặc vài kí tự trống. Giá trị tối ưu và phương án tối ưu tìm được ghi lại trong file Ketqua.out theo khuôn dạng sau: • Dòng đầu tiên ghi lại giá trị tối ưu fopt = f(x1,x2,..,xn) của hàm mục tiêu. • Dòng kế tiếp ghi lại n thành phần của phương án tối ưu xopt = (x1, x2,..,xn). Mỗi thành phần được viết cách nhau một vài kí tự trống. Ví dụ dưới đây sẽ minh họa cho file Data.in và file Ketqua.out của bài toán Data.in Ketqua.out 4 8 14 8 5 3 1 1 1 0 1 4 3 2 1 Bài giải: 3 Bài 4. Viết chương trình giải ô số sudoku. Cho bảng 9x9, chia làm 9 khối kích thước 3x3. Trong bảng có một số ô đã có số, hãy điền số vào các ô trống sao cho: - Mỗi khối 3x3 chỉ chứa các số từ 1 đến 9 và không trùng nhau. - Mỗi hàng và mỗi cột của bảng 9x9 chỉ chứa các số từ 1 đến 9 và không trùng nhau. Bài 5. Giống bài 4 nhưng điền số chẵn vào ô màu xanh, số lẻ vào ô màu trắng 21
  • 22. Bài 6. Giống bài 4 nhưng thay khối 3x3 bằng đa giác. Bài 7. Giống bài 16 nhưng thay khối 3x3 bằng đa giác có tổng cho trước Bài 8. Viết lại hàm Bubble Sort sao cho các phần tử lớn lần lượt đưa về cuối dãy (phần tử lớn được "chìm" xuống). Bài 9. Sử dụng cấu trúc heap, viết hàm tìm m phần tử lớn nhất trong dãy có n phần tử. Bài 10. Cho cấu trúc heap có n phần tử, viết hàm xoá phần tử ở vị trí thứ i trên heap sao cho vẫn bảo toàn cấu trúc heap. Bài 11. Cài đặt thuật toán Ternary Heap sort (giống thuật toán heap sort) như sau: Một dãy có n phần tử gọi là một heap (đống) nếu ai >=max (a3i+1, a3i+2,a3i+3) với mọi i =0, …,n/3-1 Bài 12. Cho file văn bản chứa dãy số nguyên, dùng thuật toán sắp xếp ngoại (merge sort) để sắp xếp dãy số trong file. Bài 13. Viết chương trình cộng nhẩm co10 bài, các bài sai được làm lại lần nữa theo thứ tự sai (bài sai trước làm trước). 1)1+0=2 =>Sai 2)2+1=3 =>Đúng 3)2+3=4 =>Sai … 10) … Bạn được làm các bài sai một lần nữa: 1)1+0=1 =>Đúng 22
  • 23. 3)2+3=6 =>Sai, đáp số là 5 vv… Bạn làm sai 1 bài, được 9 điểm HD: cất các bài sai vào queue, sau đó lấy ra cho làm lại. Bài 14. Hãy đề nghị một cách cài đặt queue mà không cần “hy sinh” một ô trống để phân biệt trường hợp queue trống với trường hợp queue đầy, và hãy cài đặt cụ thể. HD: - Tạo queue rỗng: front = rear = -1 - Kiểm tra queue rỗng: front= -1 - Kiểm tra queue đầy: front=rear - Cất dữ liệu vào queue: rear=(rear+1)%max nếu (front=rear) thì thông báo “đầy” và thoát data[rear]=dl nếu (front=-1) thì front=0 - Lấy dữ liệu từ queue: + nếu (front=-1) thì thông báo “rỗng” và thoát dl=data[front] + nếu (front=rear) thì front=rear=-1 ngược lại front=(front+1)%max trả về dl. Bài 15. Hãy xây dựng cấu trúc hàng đợi có độ ưu tiên (mỗi phần tử có một giá trị gọi là độ ưu tiên, phần tử nào có độ ưu tiên cao hơn sẽ được lấy ra trước) và xây dựng các phép toán trên cấu trúc này. HD: Cấu trúc hàng đợi: dùng mảng nhưng không cho vòng lại. typedef int datatype; //kieu dl trong hang doi struct pdatatype { datatype d; //du lieu int p; //do uu tien }; struct queue { int rear; //vi tri cat dl, front luon=0, rear la vi tri cua phan tu cuoi hang doi, rear luôn tăng pdatatype data[maxqueue];//mang chua cac phan tu cua hang doi 23 (1,1,0)(3,2,3)012… rearfront
  • 24. }; Mỗi phần tử trong hàng đợi có một độ ưu tiên, khi cất dl vào hàng đợi, tìm vị trí chèn vào sao cho hàng đợi luôn là một dãy giảm theo độ ưu tiên. Phần tử được lấy ra luôn là phần tử đầu hàng đợi (phần tử thứ 0), sau đó dời các phần tử của hàng đợi qua trái một vị trí, rear=rear-1. Hàng đợi đầy khi rear=maxqueue-1 (khởi tạo ban đầu rear=-1). Hàng đợi rỗng khi rear=-1 Nhận xét: theo cách trên lấy ra dồn lại, có thể chỉ dồn khi chèn vào mà hết chỗ. Hãy so sánh và xây thêm cấu trúc theo cách này. Bài 16. Viết chương trình tự điển Anh-Việt có các hàm sau: a) Nhập các từ tiếng Anh và nghĩa tiếng việt, ghi vào file tudien.dat dạng nhị phân. b) Đọc file tudien.dat vào cây BST. c) Biết từ tiếng Anh, tìm nghĩa tiếng Việt trên cây. d) Hủy từ tiếng Anh trên cây. e) Biết từ tiếng Anh, cập nhật nghĩa tiếng Việt trên cây hoặc cập nhật từ tiếng Anh trên cây. f) Nhập thêm các từ tiếng Anh và nghĩa tiếng việt chèn vào cây. g) Ghi cây vào file tudien.dat theo thứ tự anphabet của phần tiếng Anh. Bài 17. Làm giống bài 6 nhưng dùng file index, nghĩa là mỗi nút chỉ lưu từ tiếng Anh và số thứ tự của mẫu tin chứa từ tiếng Anh này trong file tudien.dat. Bài 18. Số điện thọai di động của một hãng viễn thông được đánh số theo qui cách 091N.XXX.XXX, trong đó N là số nguyên từ 1 đến 4 và X là số nguyên từ 0 đến 9. Trong dịp khuyến mãi, công ty phát hành hai lọai số điện thọai có tính chất sau để thu hút khách hàng sử dụng dịch vụ: - Số điện thọai lọai I: là những số mà sáu chữ số cuối khi đọc xuôi từ trái sang phải hay từ phải sang trái đều nhận được cùng một số có sáu chữ số. Ví dụ: sô 0913 558855 - Số điện thọai lọai II: là những số điện thọai lọai I mà tổng sáu chữ số cuối bằng 8. Ví dụ số 0913 202202. Hãy viết chương trình ghi các số điện thọai lọai I trong file data1.out và ghi các số điện thọai lọai II trong file data2.out theo quy cách sau: dòng đầu tiên ghi số các số điện thoại lọai I hay II, các d2ng tiếp theo ghi danh sách các số tìm được, mỗi số trên một dòng. Bài giải: 24 Bài 19. Cho đồ thị vô hướng được lưu trữ trong file văn bản dothi.in theo khuôn dạng sau: - Dòng đầu tiên ghi số đỉnh của đồ thị - Mỗi dòng kế tiếp ghi hai đỉnh của một cạnh đồ thị, hai đỉnh được ghi cách nhau một hoặc vài ký tự trống. Viết chương trình kiểm tra tính liên thông của đồ thị, kết quả được ghi trong file văn bản ketqua.out theo khuôn dạng như sau: - Dòng thứ nhất ghi : đồ thị liên thông hoặc đồ thị không liên thông - Nếu đồ thị không liên thông thì mỗi dòng tiếp theo ghi các đỉnh của một thành phần liên thông. Ví dụ: 24 file ketqua.out do thi khong lien thong thanh phan lien thong thu 1: 1 2 7 thanh phan lien thong thu 2: 3 5 thanh phan lien thong thu 3: 4 6 8
  • 25. file dothi.in 8 1 2 1 7 2 7 3 5 4 6 4 8 6 8 Bài giải 25: Bài 20. a) Cài đặt thuật toán Heap Sort (heap bậc 2): dãy ai gọi là heap nếu ai>=a2i ; a2i+1 với mọi i=1,2,... b) Cài đặt thuật toán Ternary Heap sort (heap bậc 3): dãy ai gọi là heap nếu ai>=a3i-1; a3i; a3i+1 với mọi i=1,2,…. c) Cài đặt thuật toán Heap sort có heap bậc 4 như sau: dãy ai gọi là heap nếu ai>=a4i-2; a4i-1; a4i ; a4i+1 với mọi i=1,2,…. Bài giải 26 Bài 21. Cài đặt thuật tóan quick sort, không dùng kỹ thuật đệ qui, dùng stack để khử đệ qui, stack được cài đặt bằng danh sách liên kêt. Bài giải 27 Bài 22. Cho file văn bản chứa dãy số nguyên, dùng thuật toán merge sort để sắp xếp dãy số trên file. Bài giải 28 Bài 23. Viết chương trình quản lý điểm sinh viên có các chức năng sau: a) Nhập bảng điểm lưu vào file sinhvien.dat dạng nhị phân, biết rằng mỗi mẫu tin trong file sinhvien.dat có cấu trúc sau: mã sinh viên, họ, tên, điểm lý thuyết, điểm thực hành, điểm trung bình. b) Xuất file sinhvien.dat ra màn hình. c) Dùng thuật toán sắp xếp ngoại (merge sort) để sắp xếp file sinhvien.dat trong hai trường hợp sau: + sắp xếp theo thứ tự điểm trung bình giảm dần. + sắp xếp theo tên, cùng tên sắp theo họ. d) Dùng thuật toán tìm nhị phân để tìm sinh viên theo mã sinh viên Bài giải 29 Bài 24. Cây khung (Prim) Cho đồ thị vô hướng, liên thông được lưu trữ trong file văn bản caykhung.in theo khuôn dạng sau: - Dòng đầu tiên ghi số đỉnh và đỉnh xuất phát s. 25
  • 26. - Mỗi dòng kế tiếp ghi đỉnh đầu, đỉnh cuối và trọng số của một cạnh. Viết chương trình tìm cây khung ngắn nhất của đồ thị, kết quả được ghi trong file văn bản caykhung.out, theo khuôn dạng sau:dòng đầu tiên ghi số cạnh và chiều dài cây khung, các dòng tiếp theo ghi các cạnh cây khung, mỗi dòng ghi một cạnh cùng trọng số của cạnh. Ví dụ: file caykhung.in 6 1 1 2 33 1 3 17 2 3 18 2 4 20 3 4 16 3 5 4 4 5 9 4 6 8 5 6 14 file caykhung.out 5 56 3 1 17 5 3 4 4 5 9 6 4 8 2 3 18 Bài giải 30: Bài 25. Hãy viết chương trình liệt kê tất cả các số tự nhiên K thỏa mãn đồng thời các điều kiện (a), (b), (c) và (d) dưới đây, biết rằng P, S, B được nhập từ bàn phím: a) K là số nguyên tố có từ a đến b chữ số. (a,b nhập từ bàn phím và 1<=a,b<=9; a<=b) b) Các chữ số của K khác P (P = 0, 1, 2, ..,9). c) Tổng các chữ số của K chia hết cho S. d) Biểu diễn của K ở hệ cơ số B là một số thuận nghịch (số K được gọi là thuận nghịch nếu ta đọc từ trái sang phải hay từ phải sang trái các chữ số của K ta đều nhận được chính nó). Bài giải 31: Bài 26. Dãy con có tổng lớn nhất Bạn nào có code để tìm dãy con tăng có tổng lớn nhất trong một dãy số cho trước (thực hay nguyên tùy ý)? Bạn đưa yêu cầu chưa rõ vì nếu chỉ yêu cầu dãy con có tổng lớn nhất thì chính dãy đã cho là có tổng lớn nhất. Cũng có thể là bài toán dãy con không giảm dài nhất, bạn có nắm rõ đề bài không? Cảm ơn anh admin, đúng là dãy con tăng có tổng lớn nhất. Ví dụ: VD: 1 2 4 5 2 3 0 1 5 8 9 12 1 0 3 thì có các dãy "con tăng" là : 1 2 4 5 26 1 2 4 6 53 33 18 17 4 14 8 16 20 9
  • 27. 2 3 0 1 5 8 9 12 0 3 vậy là có 4 dãy con tăng trong đó chỉ in ra dãy con tăng dài nhất là: 0 1 5 8 9 12 Bài 27. Dãy con TĂNG hay KHÔNG GIẢM? Nếu là yêu cầu như vậy thì rất đơn giản, chi phí thuật toán là O(n) thôi. Bạn dùng 2 biến để lưu tổng giá trị lớn nhất hiện hành và chỉ số của phần tử sau cùng của dãy con đó. Bạn dùng 2 biến khác để lưu tổng giá trị và chỉ số sau cùng của dãy đang xét. Nếu kết thúc dãy đang xét thì so sánh với dãy lớn nhất hiện hành để cập nhật lại dãy lớn nhất nếu có. Chỉ cần 1 vòng lặp for là đủ. Đề bài phát biểu là dãy con tăng chứ không phải dãy con tăng liên tiếp. Theo như ví dụ của meocon thì dãy con tăng có tổng lớn nhất phải là: 1 2 4 5 8 9 12. Bạn meocon kiểm tra lại xem. Bài 28. Đếm số password! Mỗi người dùng trong một hệ thống máy tính đều có một password dài 6 ký tự , trong đó các ký tự là chữ cái hoa hay chữ số, hay ký tự lạ. Mỗi password phải chứa ít nhất 1 chữ cái hoa, một chữ số và một ký tự lạ. Hõi có thể có bao nhiêu password. Gọi n là số ký tự lạ được phép dùng đặt password. Tổng số password có thể có: (26+10+n)6 = (36+n)6 (1) Tổng số password không chứa chữ cái hoa: (10+n)6 (2) Tổng số password không chứa chữ số: (26+n)6 (3) Tổng số password không chứa ký tự lạ: (26+10)6 =366 (4) Vậy số password dài 6 ký tự có chứa ít nhất 1 chữ cái hoa, 1 chữ số và 1 ký tự lạ là: (1) - (2) - (3) - (4) = (36+n)6 - (10+n)6 - (26+n)6 - 366 Theo tôi, "Tổng số password có thể có: (26+10+n)6 = (36+n)6 " là ko đúng mà phải là "Chỉnh hợp chập 6 của (26+10+n) phần tử". Do đó Tổng số password có thể có: (36+n)! / (30+n)! Xin cho ý kiến nếu tôi nhầm lẫn , tks Cảm ơn bạn đã đóng góp ý kiến. Mình xin phân tích như sau: Password có 6 ký tự, mỗi ký tự có (26+10+n) cách chọn. Vậy ký tự thứ 1 có (26+10+n) cách chọn. Ứng với mỗi cách chọn của ký tự thứ 1, thì ký tự thứ 2 cũng có (26+10+n) cách chọn. Tương tự cho ký tự thứ 6. Theo nguyên lý nhân của phép đếm thì tổng số cách chọn sẽ là (26+10+n)6 . Nếu hiểu là password phải vừa có ít nhất một chữ cái hoa, vừa có ít nhất một số, và vừa có ít nhất 1 ký tự lạ thì: Tổng số pass word có thể có ở đây còn bao gồm cả loại: chỉ toàn chữ hoa(26^6), chỉ toàn số(10^6), chỉ toàn ký tự lạ(n^6).Mình cần trừ thêm khoảng này này nữa. Hông biết em hiểu có đúng đề bài hông nữa? Cảm ơn câu hỏi của bạn dù rằng trong cách giải trên của mình đã trừ luôn những trường hợp bạn đưa ra. Nhưng nhờ câu hỏi của bạn mà mình nghĩ kỹ thì thấy cách giải trên đã trừ dư (trừ lặp), nghĩa là đã bị sai. Xin được phân tích lại bài toán: 27
  • 28. Gọi X là tập tất cả password có chứa ít nhất 1 chữ cái hoa, một chữ số và một ký tự lạ Gọi A là tập tất cả password, |A| = (26 + 10 + n)6 . Gọi B là tập tất cả password không chứa chữ cái hoa, |B| = (10 + n)6 . Gọi C là tập tất cả password không chứa chữ số, |C| = (26 + n)6 . Gọi D là tập tất cả password không chứa chữ ký tự lạ, |D| = (26 + 10)6 . Khi đó: Trong đó: - B ∩ C là tập các password không chứa chữ cái hoa và chữ số, nghĩa là chỉ chứa kí tự lạ, |B ∩ C| = n6 . - B ∩ D là tập các password không chứa chữ cái hoa và kí tự lạ, nghĩa là chỉ chứa chữ số, |B ∩ D| = 106 . - C ∩ D là tập các password không chứa chữ số và kí tự lạ, nghĩa là chỉ chứa chữ cái hoa, |C ∩ D| = 266 . - B ∩ C ∩ D là tập các password không chứa chữ cái hoa, chữ số và kí tự lạ, tập này là rỗng. Vậy |X| = (26 + 10 + n)6 - (10 + n)6 - (26 + n)6 - (26 + 10)6 + n6 + 106 + 266 . Ah, đúng rùi trong cách làm cũ của admin đã bao gồm cái em hỏi rùi. Hihi... Nhưng với cách làm mới của anh thì: - Chứng minh thì hợp lý. - Nhưng hiểu theo nghĩa thông thường thì hổng hợp lý phải hông admin (tại sao hổng trừ cái khoản đó ra? Tại sao admin bảo là bị lặp?). Bài 29. Cho đồ thị vô hướng được lưu trữ trong file văn bản dothi.in theo khuôn dạng sau: - Dòng đầu tiên ghi số đỉnh của đồ thị - Mỗi dòng kế tiếp ghi hai đỉnh của một cạnh đồ thị, hai đỉnh được ghi cách nhau một hoặc vài ký tự trống. Viết chương trình kiểm tra tính liên thông của đồ thị, kết quả được ghi trong file văn bản ketqua.out theo khuôn dạng như sau: - Dòng thứ nhất ghi : đồ thị liên thông hoặc đồ thị không liên thông - Nếu đồ thị không liên thông thì mỗi dòng tiếp theo ghi các đỉnh của một thành phần liên thông. Ví dụ: file dothi.in 8 1 2 1 7 2 7 3 5 4 6 28 file ketqua.out do thi khong lien thong thanh phan lien thong thu 1: 1 2 7 thanh phan lien thong thu 2: 3 5 thanh phan lien thong thu 3: 4 6 8
  • 29. 4 8 6 8 Chú ý: làm bài tập tương tự với đồ thị có hướng Bài giải 35 Bài 30. Cho n thành phố, người du lịch xuất phát từ một thành phố, đi thăm tất cả các thành phố còn lại mỗi thành phố một lần và quay về thành phố xuất phát. Viết chương trình tìm lộ trình có chi phí nhỏ nhất, biết rằng bảng chi phí lưu trong file văn bản Chiphi.in theo khuôn dạng sau: • Dòng đầu tiên ghi lại hai số tự nhiên n và s (n là số thành phố, s là thành phố xuất phát), hai số được viết cách nhau bởi một hoặc vài kí tự trống. • Trên n dòng kế tiếp, dòng thứ i (i=1,..,n) ghi n số nguyên dương ci,1; ci,2;…; ci,n với ci,j là chi phí đi từ thành phố thứ i đến thành phố j, ci,j bằng 0 nếu không có đường đi trực tiếp từ i đến j, các số được viết cách nhau bởi một hoặc vài kí tự trống. Chi phí nhỏ nhất và lộ trình có chi phí nhỏ nhất tìm được, hãy ghi lại trong file Lotrinh.out theo khuôn dạng sau: • Dòng đầu tiên ghi lại chi phí nhỏ nhất. • Dòng kế tiếp ghi lại lộ trình tối ưu. Ví dụ dưới đây sẽ minh họa cho file Chiphi.in và file Lotrinh.out của bài toán Chiphi.in Lotrinh.out 4 3 0 5 3 1 4 0 2 4 6 1 0 5 9 3 2 0 Bài giải 36 Bài 31. Số điện thoại di động của một hãng viễn thông là một số có 10 chữ số dạng 09.M.N.XXX.XXX. Miền xác định của các chữ số M, N. X được xác định như sau: • M là số có giá trị từ 1 đến 7. • N là số có giá trị từ 2 đến 9. • X là số có giá trị từ 0 đến 9. Hãy cho biết hãng viễn thông có thể phát hành được bao nhiêu số điện thoại thuộc mỗi loại a, b, c, d dưới đây? a) Số các số di động có sáu số cuối cùng XXX.XXX tạo thành một số thuận nghịch sáu chữ số? Ví dụ số: 0913. 103301 có sáu số cuối cùng là 103301 là số thuận nghịch. b) Số các số di động có sáu số cuối cùng XXX.XXX tạo thành một số thuận nghịch sáu chữ số và tất cả các chữ số này đều khác 0? Ví dụ số: 091.2.122221 có sáu số cuối cùng 122221 là một số thuận nghịch và không chứa số 0 nào. c) Số các số di động có sáu số cuối cùng XXX.XXX là một số thuận nghịch có sáu chữ số và tổng sáu chữ số cuối cùng là 20? Ví dụ số: 0913.505505. 29
  • 30. d) Số các số di động có sáu số cuối cùng XXX.XXX là một số thuận nghịch có sáu chữ số và tổng sáu chữ số cuối cùng là 42? Ví dụ số: 0913.984489. e) Số các số di động có sáu số cuối cùng X1X2X3.X4X5X6 là một số thuận nghịch có sáu chữ số và tổng sáu chữ số cuối cùng là 42? Biết rằng 1<X1<=3; 3<=X2<5;X3<=2 HD: a) 7.8.9.10.10=50400 b) 7.8.9.9.9=40824 c) x1+x2+x3=10 (1<=x1<=9; 0<=x2<=9; 0<=x3<=9) Đặt: A={1<=x1<=9; 0<=x2<=9; 0<=x3<=9}; |A|=? X={x1>=1; x2>=0; x3>=0 }=>|X|=C(n+k-1,k)=C(11,9)=55 Ta có: A⊆X=>|A|=|X|-|A| A ={x1>=10 hoặc x2>=10 hoặc x3>=10}=A1∪A2∪A3 với: A1={x1>=10; x2>=0; x3>=0}=>|A1|=C(2,0)=1 A2={x1>=1; x2>=10; x3>=0}=>|A2|=0 A3={x1>=1; x2>=0; x3>=10}=>|A3|=0 do Ai∩Aj =∅ với i≠j nên |A|=| A1∪A2∪A3|=|A1|+|A2|+|A3|=1 => |A|=55-1=54 =>Đáp số= 56.54=3024 d) x1+x2+x3=21 (1<=x1<=9; 0<=x2<=9; 0<=x3<=9) Đặt: A={1<=x1<=9; 0<=x2<=9; 0<=x3<=9}; |A|=? X={x1>=1; x2>=0; x3>=0 }=>|X|= C(22,20)=231 Ta có:A⊆X=>|A|=|X|-|A| A ={x1>=10 hoặc x2>=10 hoặc x3>=10}=A1∪A2∪A3 với: A1={x1>=10; x2>=0; x3>=0};A2={x1>=1; x2>=10; x3>=0} A3={x1>=1; x2>=0; x3>=10} |A|=| A1∪A2∪A3|=|A1|+|A2|+|A3|-|A1∩A2|-|A1∩A3|-|A2∩A3|+|A1∩A2∩A3| Ta có: |A1|= C(13,11)=78 |A2|=|A3|=C(12,10)=66 |A1∩A2|=|A1∩A3|= C(3,1)=3; |A2∩A3|=C(2,0)=1 30
  • 31. |A1∩A2∩A3|=0 Vậy: |A|=78+66+66-3-3-1+0=203=> |A|=231-203=28 =>Đáp số= 56.28=1568 e) x1+x2+x3=21 (1<x1<=3; 3<=x2<5;x3<=2) Đặt: A={1<x1<=3; 3<=x2<5; x3<=2}; |A|=? X={x1>=2; x2>=3; x3>=0 }=>|X|=C(n+k-1,k)=C(3+16-1,16)=C(18,16)=153 Ta có: A⊆X=>|A|=|X|-|A| A ={x1>=4 hoặc x2>=5 hoặc x3>=3}=A1∪A2∪A3 với: A1={x1>=4; x2>=3; x3>=0} A2={x1>=2; x2>=5; x3>=0} A3={x1>=2; x2>=3; x3>=3} |A|=| A1∪A2∪A3|=|A1|+|A2|+|A3|-|A1∩A2|-|A1∩A3|-|A2∩A3|+|A1∩A2∩A3| Ta có: |A1|=|A2|=C(16,14)=120; |A3|=C(15,13)=105 |A1∩A2|=C(14,12)=91; |A1∩A3|=|A2∩A3|=C(13,11)=78 |A1∩A2∩A3|= C(11,9)=55 Vậy: /|A|=120+120+105-91-78-78+55=153 => |A|=0 =>Đáp số=56.0=0 Bài 32. Bài 1: a) Cài đặt thuật toán Heap Sort: dãy ai gọi là heap nếu ai>=a2i ; a2i+1 với mọi i=1,2,... b) Cài đặt thuật toán Ternary Heap sort: dãy ai gọi là heap nếu ai>=a3i-1; a3i; a3i+1 với mọi i=1,2,…. Bài giải 39 31