MỤC LỤC
I. MỞ ĐẦU............................................................................................................1
1.1. LÍ DO CHỌN ĐỀ TÀI .................................................................................1
1.2. Mục đích nghiên cứu ....................................................................................1
1.3. Đối tượng nghiên cứu....................................................................................2
1.4. Phương pháp nghiên cứu..............................................................................2
II. NỘI DUNG.......................................................................................................3
2.1. CƠ SỞ LÍ LUẬN...........................................................................................3
2.2. THỰC TRẠNG VẤN ĐỀ TRƯỚC KHI ÁP DỤNG SKKN......................4
2.3. CÁC THUẬT TOÁN TÌM KIẾM NỘI.......................................................5
2.3.1. Tìm kiếm tuần tự...................................................................................5
2.3.2. Tìm kiếm nhị phân................................................................................7
2.4. TÌM KIẾM THEO CHIỀU SÂU ................................................................10
2.4.1 Ý tưởng....................................................................................................10
2.4.2. Thủ tục đệ quy THAMDFS..................................................................10
2.5. TÌM KIẾM THEO CHIỀU RỘNG.............................................................12
2.5.1. Ý tưởng:..................................................................................................12
2.5.2. Giải thuật...............................................................................................13
2.6. HIỆU QUẢ CỦA SKKN ĐỐI VỚI HOẠT ĐỘNG GIÁO DỤC...............17
III.KẾT LUẬN VÀ KIẾN NGHỊ........................................................................19
3.1. KẾT LUẬN...............................................................................................19
3.2. KIẾN NGHỊ..............................................................................................19
I. MỞ ĐẦU
1.1. LÍ DO CHỌN ĐỀ TÀI
Với sự phát triển mạnh mẽ của ngành tin học và truyền thông đã tạo nên một xã
hội học tập, mọi người đều có quyền bình đẳng được học, được nghiên cứu. Trước
sự đổi mới của sự nghiệp giáo dục và đào tạo nên xã hội yêu cầu nhà trường không
ngừng phải nâng cao chất lượng giáo dục toàn diện cho học sinh. Bằng cách cung
cấp cho học sinh đầy đủ kiến thức để theo kịp thời đại. Do vậy tin học đã được đưa
đồng bộ vào nhà trường phổ thông từ năm 2006 với tư cách là một môn học chính
thống. Vấn đề đặt ra là nhà trường và ngành giáo dục cần phải tìm biện pháp để
nâng cao chất lượng truyền thụ kiến thức và rèn luyện kỹ năng cho người học.
Ở khối 11 THPT, môn tin học với tư tưởng là sử dụng ngôn ngữ Pascal để rèn
luyện kỹ năng lập trình cho học sinh, nhưng để thực hiện được việc hình thành và
rèn luyện kỹ năng học lập trình cho học sinh thì còn gặp rất nhiều khó khăn vì yêu
cầu học sinh phải có kiến thức liên môn của môn Toán và tiếng Anh và thuật toán
hay là cấu trúc dữ liệu và giải thuật.
Hiện nay năm 2017 tức là đã 12 năm đưa môn tin học vào dạy ở THPT nhưng
thực trạng việc dạy học lập trình ở các trường phổ thông còn tồn tại nhiều phương
pháp khác nhau, hình thức truyền dạy không đồng bộ nên kết quả thu được trong
đào tạo chưa cao. Mặt khác do thiếu tài liệu hướng dẫn dạy học lập trình mang tính
hệ thống, thống nhất nên trong khi dạy và học lập trình thì giáo viên và học sinh
đang phải chịu những khó khăn, hạn chế nhất định nào đó.
Bản thân một giáo viên sư phạm ngành tin học tôi luôn trăn trở muốn khắc
phục những khó khăn trong việc dạy học, hình thành những kỹ năng lập trình cho
học sinh. Hơn thế nữa trong suốt thời gian dạy học tại trường THPT Quảng Xương
3 tôi nhận thấy việc tiếp nhận từng đơn vị kiến thức về lập trình của học sinh lớp 11
thực sự gặp khó khăn do đó đã nhen nhóm trong tôi ý tưởng có một đề tài nghiên
cứu để khắc phục các vấn đề trên. Chính vì những lẽ đó mà xin chon đề tài:
“Phương pháp ứng dụng thuật toán tìm kiếm vào dạy lập trình tin học trong
công tác bồi dưỡng học sinh giỏi” làm đề tài viết sáng kiến kinh nghiệm. Đây là
một vấn đề nhỏ trong vô số vấn đề có thể xây dựng để khai thác làm tăng hiệu quả
cho quá trình dạy bồi dưỡng học sinh giỏi môn tin học lớp 11.
1.2. MỤC ĐÍCH NGHIÊN CỨU
nâng cao chất lượng tiếp thu và lĩnh hội kiến thức về tư duy thuật toán, lập
trình các giải thuật tìm kiếm giúp học sinh hiểu bài toán và phương pháp giải quyết
vấn đề một cách nhanh nhất.
bản thân tôi và các đồng nghiệp khác trong tổ bộ môn tin học luôn luôn trao
đổi phương pháp làm sao để dạy cho học sinh có kiến thức tốt về môn lập trình, học
tốt tư duy thuật toán và cũng để các em tư duy tốt khi học các môn học khác.
với đề tài này tôi không có tham muốn gì hơn ngoài mục đích: đổi mới nội
dung, phương pháp, hình thức tổ chức giáo dục nhằm tìm ra biện pháp nâng cao
2
chất lượng, hiệu quả giảng dạy và giáo dục học sinh, bồi dưỡng đội ngũ học sinh có
học tháo gỡ những khó khăn vướng mắc trên, đồng thời cũng đóng góp phần nhỏ
trong việc cải cách, nâng cao chất lượng giáo dục nói chung và dạy học bộ môn tin
học nói riêng.
1.3. đối tượng nghiên cứu
qua quá trình dạy học môn tin học ở thpt và cụ thể là dạy học sinh rèn luyện
với kiến thức lập trình ở lớp 11, đồng thời nhận trách nhiệm bồi dưỡng học sinh
giỏi tỉnh. với thực trạng chất lượng tiếp thu bài của học sinh mà tôi người thầy giáo
giảng dạy bộ môn tin, tôi quyết định chọn đề tài nhằm đưa ra phương án cho học
sinh học tốt hơn vào các năm học tới và giải quyết 2 vấn đề sau:
- nghiên cứu bài 4: bài toán và thuật toán - sgk tin học 10 sau đó làm sáng tỏ
được bản chất của vấn đề nghiên cứu.
- nghiên cứu kiến thức sách giáo khoa tin học 11 (kiến thức liên quan đến việc
thi cử học sinh giỏi tỉnh và các cuộc thi khác như: tin học trẻ…)
- nghiên cứu học sinh khối 11 trường thpt quảng xương 3 làm sao gây hứng
thú cho học sinh khi học dạng toán lập trình có giải thuật tìm kiếm như thế này.
1.4. phương pháp nghiên cứu
mọi vấn đề, mọi đề tài nghiên cứu thì khâu chuẩn bị và xác định mục đích
nghiên cứu bao giờ cũng đóng một vai trò hết sức quan trọng. ở trong đề tài này
điều quan trọng của khâu chuẩn bị là việc chọn phương pháp để kết quả của đề tài
đi đến đích thì cần phải xác định được một phương pháp hiệu quả không lãng phí
thời gian cũng như công sức. như kinh nghiệm cho thấy đề tài có thành công hay
không còn phụ thuộc vào phương pháp tiến hành vì lẽ trên trong đề tài nghiên cứu
này tôi đã sử dụng một số phương pháp sau:
phương pháp nghiên cứu lí thuyết: tài liệu về lí luận dạy học, những vấn đề
chung về đổi mới phương pháp giáo dục trung học phổ thông, chương trình
sách giáo khoa 11, một số tài liệu chuyên tin học…
phương pháp nghiên cứu thực tiễn: thực tiễn dạy tin học từ năm 2006 đến
nay, thực tiễn về công tác bồi dưỡng học sinh giỏi.
phương pháp điều tra sư phạm: trao đổi với các thầy cô, đồng nghiệp và học
sinh ở trường, nhất là giáo viên bộ môn tin học, sau đó xử lí thông tin và rút
ra kết luận khoa học.
phương pháp kiểm tra đánh giá học sinh thực nghiệm sư phạm: soạn giảng
thành chương trình bài giảng, bộ đề kiểm tra, dạy thể nghiệm và rút kết luận
khoa học, mang tính phổ biến.
phương pháp tổng hợp và đánh giá kết quả: tổng hợp cụ thể, chi tiết, kiểm
chứng rút ra biện pháp đúng, loại trừ biện pháp không hợp lí.
trên đây là một số phương pháp cơ bản mà tôi đã vận dụng trong nghiên cứu và
hoàn thiện đề tài.
3
II. NỘI DUNG
2.1. CƠ SỞ LÍ LUẬN
Hàng năm Sở giáo dục và đào tạo tỉnh Thanh Hóa luôn tổ chức kỳ thi chọn học
sinh giỏi tỉnh môn Tin học. Kết quả học sinh giỏi cũng là một tiêu chi thi đua đánh
giá chất lượng trường học, đánh giá năng lực sư phạm của giáo viên. Như vậy ta
nhận thấy việc bội dưỡng học sinh giỏi là nhiệm vụ quan trọng trong công tác
chuyên môn của mỗi bộ môn, giáo viên luôn cố gắng để truyền tải kiến thức để học
sinh được bồi dưỡng có kết quả cao trong các kỳ thi. Và đối với bộ môn tin học
cũng vậy, trong công tác Bồi dưỡng học sinh giỏi tin học, các đề thi thường xuất
hiện các bài toán có độ phức tạp lớn, các bài toán liên quan đến xử lí các tình
huống thực tế… trong đó thường có các bài toán trong đề thi có tình huống như:
Bài toán tìm kiếm và sắp xếp dữ liệu trong một hệ thống thông tin, xử lí các vấn đề
về bộ số, mảng, xâu...
Ta cũng thấy rằng: Bài toán tìm kiếm cũng thông dụng như bài toán sắp xếp. Bài
toán tìm kiếm thường là “bạn” đồng hành với bài toán sắp xếp. Sắp xếp để tìm
kiếm thuận lợi và ngược lại tìm kiếm tạo điều kiện cho sắp xếp. Vậy nội dung bài
toán tìm kiếm là gì?
- Trong hầu hết các hệ lưu trữ, quản lý dữ liệu, thao tác tìm kiếm thường được
thực hiện nhất để khai thác thông tin:
Ví du: Tra cứu từ điển, tìm sách trong thư viện...
Do các hệ thống thông tin thường phải lưu trữ một khối lượng dữ liệu đáng kể,
nên việc xây dựng các giải thuật cho phép tìm kiếm nhanh sẽ có ý nghĩa rất lớn.
Nếu dữ liệu trong hệ thống đã được tổ chức theo một trật tự nào đó, thì việc tìm
kiếm sẽ tiến hành nhanh chóng và hiệu quả hơn:
Ví dụ: các từ trong từ điển được sắp xếp theo từng vần, trong mỗi vần lại được
sắp xếp theo trình tự alphabet; sách trong thư viện được xếp theo chủ đề ...
Ví dụ: Tìm số lớn nhất trong một tập các số nguyên, tìm số hoàn hảo,…
Vì thế, khi xây dựng một hệ quản lý thông tin trên máy tính, bên cạnh các thuật
toán tìm kiếm, các thuật toán sắp xếp dữ liệu cũng là một trong những chủ đề được
quan tâm hàng đầu.
- Có thể phân chia nội dung tìm kiếm theo các loại sau:
+ Tìm một phần tử trong một tập các đối tượng
Ví dụ 1: Tìm giá trị lớn nhất của một dãy số nguyên (VD-trang 33-sgk tin 10)
Ví dụ 2: Tìm các số nguyên tố trong các số nguyên không vượt quá số nguyên
dương N cho trước.
Ví dụ 3: Tìm những học sinh có học lực Khá trong lớp học 12A1.
Tuy nhiên bài toán tìm kiếm một phần tử trong một tập các đối tượng vẫn là bài
toán cơ bản nhất. Ngoài ra bài toán tìm kiếm cũng thường gắn liền với bài toán
đếm và liệt kê ví dụ: đếm số lượng các phần tử thõa mãn một điều kiện cho
trước hoặc có bao nhiêu số nguyên tố không vượt quá 100?
4
Ví dụ 4: Cho dãy N số nguyên và số nguyên x. Cho biết chỉ số những phần tử có
giá trị bằng x. Có bao nhiêu phần tử như vậy?
INPUT: file văn bản DAYSO.INP
- dòng đầu là N và x
- N dòng sau, lần lượt ghi các số nguyên thuộc dãy từ vị trí 1 đến vị trí N,
mỗi số trên một dòng
OUTPUT: File DAYSO.OUT
- Dòng đầu là số lượng các phần tử của dãy bằng x;
Nếu dòng đầu là dương thì dòng tiếp theo ghi chỉ số của những phần tử bằng x
…Và nhiều bài toán, dạng toán tìm kiếm khác nữa….
Và ta cũng biết, hiện nay đã có nhiều giải thuật tìm kiếm và sắp xếp được xây
dựng, mức độ hiệu quả của từng giải thuật còn phụ thuộc vào tính chất của cấu trúc
dữ liệu cụ thể mà nó tác động đến. Dữ liệu được lưu trữ chủ yếu trong bộ nhớ chính
và trên bộ nhớ phụ, do đặc điểm khác nhau của thiết bị lưu trữ, các thuật toán tìm
kiếm và sắp xếp được xây dựng cho các cấu trúc lưu trữ trên bộ nhớ chính hoặc
phụ cũng có những đặc thù khác nhau. Tôi thấy đây là một vấn đề mới để giúp học
sinh nắm phương pháp giải các bài toán phức tạp. Vì vậy tôi chọn các thuật toán
đặc trưng là thuật toán tìm kiếm nội, thuật toán tìm kiếm chiều rộng, thuật toán tìm
kiếm chiều sâu để trình bày nội dung sau đây để dạy cho học sinh khi học lập trình
tin học.
2.2. THỰC TRẠNG VẤN ĐỀ TRƯỚC KHI ÁP DỤNG SKKN
Trong quá trình ôn luyện đội tuyển học sinh giỏi, nhiều giáo viên đặc biệt là
những giáo viên trẻ, non kinh nghiệm gặp những bài toán tìm kiếm còn lúng túng,
chưa tìm ra phương pháp để truyền đạt những ý tưởng để giải bài toán. Bên cạnh đó
những học sinh lần đầu gặp những bải toán tìm kiếm cũng khá bỡ ngỡ, không biết
áp dụng thuật toán nào để làm, từ đó làm theo kiểu mày mò, thử nghiệm dẫn đến
tốn rất nhiều thời gian mà đôi khi không mang lại kết quả như mong đợi.
Trong mỗi đề thi bao giờ cũng có yêu cầu về thời gian xử lý dữ liệu. Vì vậy
việc áp dụng những thuật toán vừa mang lại kết quả chính xác, lại vừa có thời gian
xử lý nhanh thì đó là thuật toán tối ưu. Để có được các thuật toán như vậy đòi hỏi
người giáo viên phải có lượng kiến thức tốt, kết hợp với khả năng sư phạm thì sẽ
truyền đạt lại cho học sinh hiểu và vận dụng vào các bài tập cụ thể.
Thuận lợi:
Nhà trường có hệ thống cơ sở vật chất khá đầy đủ cho việc dạy tin học, được
sự quan tâm giúp đỡ của đồng nghiệp, học sinh nhiệt tình và ham học hỏi.
Việc tiếp cận tài liệu cho nghiên cứu cũng tương đối thuận lợi. Bản thân cũng
đã nhiều năm ôn luyện đội tuyển nên cũng có đôi chút kinh nghiệm.
Khó khăn:
Việc chọn học sinh cho đội tuyển Tin học gặp nhiều khó khăn vì những học
sinh khá, giỏi thì các môn Toán, Lý, Hóa chọn trước. Bên cạnh đó phụ huynh học
5
sinh cũng không muốn con mình vào đội tuyển Tin học, để dành thời gian cho việc
học các môn phục vụ thi đại học.
2.3. CÁC THUẬT TOÁN TÌM KIẾM NỘI
Ðể đơn giản trong việc trình bày giải thuật, bài toán được đặc tả như sau:
Bài toán tổng quát: Cần tìm kiếm một phần tử trong tập N đối tượng cho trước,
chúng ta lưu dữ liệu phản ánh các đối tượng này vào mảng một chiều A[1..N], mỗi
phần tử của mảng là một bản ghi gồm các trường lưu giá trị các đặc tính của một
đối tượng. Trong các trường này giả sử chọn trường k làm khóa so sánh giữa các
phần tử. Bài toán đặt ra là tìm một phần tử có giá trị khóa k 0 trong tập N đối tượng
này. Có 2 giải thuật thường được áp dụng để tìm kiếm dữ liệu là tìm tuần tự và tìm
nhị phân.
2.3.1. Tìm kiếm tuần tự
Bắt đầu từ bản ghi đầu tiên chuyển dần về phía cuối mảng, lần lượt so sánh giá
trị khóa của bản ghi này với k0 , nếu giá trị của bản ghi nào bằng k0 thì hiện bản ghi
đó ( hoặc lưu trữ lại chỉ số của bản ghi đó; đồng thời tăng biến đếm số lượng phần
tử có giá trị bằng khóa k0). Nếu duyệt hết mọi bản ghi mà biến đếm có giá trị bằng
0 thì kết luận trong tập đối tượng đã cho không có phần tử nào có giá trị bằng khóa
k0.
Cài đặt Giải thuật
Tìm tuần tự là một kỹ thuật tìm kiếm rất đơn giản và cổ điển.
Các bước tiến hành như sau :
Procedure Timkiem;
Var i: integer;
Begin
For i:=1 to n do
If a[i].k= k0 then
Begin
Inc(soluong);
Luu(soluong):=i;
End;
End;
* Trong chương trình con trên, biến soluong và luu[1..N] là biến toàn cục, phục
vụ đưa ra kết luận sau khi tìm kiếm
Ví dụ
Cho dãy số a: 12
2
8
5
1
6
4
15
Nếu giá trị cần tìm là 8, giải thuật được tiến hành như sau :
Hình 2.2
6
i=1
Hình 2.3
i=2
i = 3 -> Dừng.
Ðánh giá giải thuật
Có thể ước lượng độ phức tạp của giải thuật tìm kiếm qua số lượng các phép so
sánh được tiến hành để tìm ra ko. Trường hợp giải thuật tìm tuần tự, có:
Trường hợp
Số lần so sánh
Giải thích
Tốt nhất
1
Phần tử đầu tiên có giá trị k0
Xấu nhất
n+1
Phần tử cuối cùng có giá trị k0
Trung bình
(n+1)/2
Giả sử xác suất các phần tử trong
mảng nhận giá trị k0 là như nhau.
Vậy giải thuật tìm tuần tự có độ phức tạp tính toán cấp n: T(n) = O(n)
NHẬN XÉT
- Giải thuật tìm tuần tự không phụ thuộc vào thứ tự của các phần tử mảng, do
vậy đây là phương pháp tổng quát nhất để tìm kiếm trên một dãy số bất kỳ.
- Một thuật toán có thể được cài đặt theo nhiều cách khác nhau, kỹ thuật cài đặt
ảnh hưởng đến tốc độ thực hiện của thuật toán.
7
2.3.2. Tìm kiếm nhị phân
Phép tìm kiếm nhị phân chỉ được sử dụng sau khi mảng các bản ghi đã được sắp
xếp (tăng hoặc giảm) theo khóa k. Giả sử giá trị khóa của bản ghi ở đầu mảng (đã
sắp xếp) là k1 và giá trị khóa của bản ghi ở cuối mảng (đã sx) là k 2. Phần tử cần tìm
kiếm có giá trị khóa là k0.
Ta phân tích cách tìm kiếm nhị phân diễn ra như sau:
- Chọn ra một bản ghi ở vị trí trung gian là vị trí vt giua = (vtdau+vtcuoi) div 2, giả
sử giá trị khóa của bản ghi ở vị trí trung gian này là kgiua;
- Nếu k0
vậy chỉ cần tìm kiếm tiếp trong đoạn [vtdau .. vtgiua-1] bằng đệ quy.
- Nếu k0>kgiua thì phần tử cần tìm chỉ có thể trong đoạn từ vt giua+1 đến vtcuoi. Vì
vậy chỉ cần tìm kiếm tiếp trong đoạn [vtgiua+1 .. vtcuoi] bằng đệ quy.
- Nếu k0=kgiua thì ghi nhận chỉ số bản ghi hoặc hiện ngay bản ghi này là phần
tử cần tìm.
Cài đặt Giải thuật
Procedure TIMKIEM2 (vtdau,vtcuoi:integer);
Var vtgiua:integer;
Begin
Vtgiua:=(vtdau+vtcuoi) div 2;
If a[vtgiua].k = k0 then
Begin
{ thông báo tìm kiếm kết quả thành công hoặc hiện số hiệu phần tử tìm
được}
End
ELSE
If (a[vtgiua].k>k0) and (vtdau>vtgiua) then timkiem2(vtdau,vtgiua-1)
Else
If (a[vtgiua].k
End;
Ví dụ
Cho dãy số a gồm 8 phần tử:
1 2
4
5
6
8
12
15
Nếu giá trị cần tìm là 8, giải thuật được tiến hành như sau:
left = 1, right = 8, midle = 4
8
left = 5, right = 8, midle = 6
Dừng.
Ðánh giá giải thuật
Trường hợp giải thuật tìm nhị phân, có bảng phân tích sau :
Trường
hợp
Số
sánh
lần
so
Giải thích
Tốt nhất
1
Phần tử giữa của mảng có giá trị x
Xấu nhất
log 2 n
Không có x trong mảng
Trung
bình
log 2 n/2
Giả sử xác suất các phần tử trong mảng nhận giá
trị x là như nhau
Vậy giải thuật tìm nhị phân có độ phức tạp tính toán cấp n: T(n) = O(log 2 n)
NHẬN XÉT
- Giải thuật tìm nhị phân dựa vào quan hệ giá trị của các phần tử mảng để định
hướng trong quá trình tìm kiếm, do vậy chỉ áp dụng được cho những dãy đã có thứ
tự.
- Giải thuật tìm nhị phân tiết kiệm thời gian hơn rất nhiều so với giải thuật tìm
tuần tự do Tnhị phân (n) = O(log 2 n) < Ttuần tự (n) = O(n).Tuy nhiên khi muốn áp dụng
giải thuật tìm nhị phân cần phải xét đến thời gian sắp xếp dãy số để thỏa điều kiện
dãy số có thứ tự. Thời gian này không nhỏ, và khi dãy số biến động cần phải tiến
hành sắp xếp lại . Tất cả các nhu cầu đó tạo ra khuyết điểm chính cho giải thuật tìm
nhị phân. Ta cần cân nhắc nhu cầu thực tế để chọn một trong hai giải thuật tìm kiếm
trên sao cho có lợi nhất
Ví dụ khi dạy bài 4 – Bài toán thuật toán (tin học 10) ta có thể đưa ra một
số bài tập như sau:
Bài 1: viết thuật toán bằng đồ khối hoặc bằng liệt kê từng bước tìm giá trị lớn nhất
trong 2 số nguyên a, b nhập từ bàn phím. sau đó viết chương trình hoàn thiện?
Bài 2: viết thuật toán bằng liệt kê từng bước hoặc bằng đồ khối tìm giá trị lớn nhất
trong 3 số nguyên a, b, c nhập từ bàn phím. sau đó viết chương trình hoàn thiện?
Bài 3: viết thuật toán bằng đồ khối hoặc bằng liệt kê từng bước tìm giá trị lớn nhất
trong 4 số nguyên a, b, c, d nhập từ bàn phím. sau đó viết chương trình hoàn thiện?
Bài 4: viết thuật toán bằng sơ đồ khối hoặc bằng liệt kê từng bước tìm giá trị lớn
nhất của một dãy số nguyên nhập từ bàn phím. sau đó viết chương trình hoàn
thiện?
9
Ví dụ khi dạy bài 11 – Kiểu mảng (tin học 11) giáo viên có thể đưa ra các bài
tập sau:
1. Xét mảng các số nguyên có nội dung như sau :
-9
-9
-5
-2
0
3
7
7
10
15
a. Tính số lần so sánh để tìm ra phần tử X = -9 bằng phương pháp:
• Tìm tuần tự
• Tìm nhị phân
Nhận xét và so sánh 2 phương pháp tìm nêu trên trong trường hợp này và trong
trường hợp tổng quát.
b. Trong trường hợp tìm nhị phân, phần tử nào sẽ được tìm thấy (thứ 1 hay 2)
2. Xây dựng thuật toán tìm phần tử nhỏ nhất (lớn nhất) trong một mảng các số
nguyên.
3. Hãy viết hàm tìm tất cả các số nguyên tố nằm trong mảng một chiều a có n
phần tử.
4. Hãy viết hàm tìm dãy con tăng dài nhất của mảng một chiều a có n phần tử
(dãy con là một dãy liên tiếp các phần của a).
Ví dụ khi dạy bài 16 – lớp 11: Kiểu dữ liệu tệp giáo viên có thể ra các bài
tập sau:
Bài 1: Cho dãy N số nguyên và số nguyên x. Bằng phương pháp tìm kiếm tuần tự
cho biết chỉ số những phần tử có giá trị bằng x. Có bao nhiêu phần tử như vậy?
INPUT: file văn bản DAYSO.INP
- dòng đầu là N và x
- N dòng sau, lần lượt ghi các số nguyên thuộc dãy từ vị trí 1 đến vị trí N,
mỗi số trên một dòng
OUTPUT: File DAYSO.OUT
- Dòng đầu là số lượng các phần tử của dãy bằng x;
Nếu dòng đầu là dương thì dòng tiếp theo ghi chỉ số của những phần tử bằng x
Bài 2: Cho dãy N số nguyên và số nguyên x. Sắp xếp dãy tăng, bằng phương pháp
tìm kiếm nhị phân cho biết chỉ số một phần tử có giá trị bằng x.
INPUT: file văn bản DAYSO.INP
- dòng đầu là N và x
- N dòng sau, lần lượt ghi các số nguyên thuộc dãy từ vị trí 1 đến vị trí N,
mỗi số trên một dòng
OUTPUT: File DAYSO.OUT
- Dòng đầu ghi 1 hoặc 0 tương ứng với trường hợp tìm được hoặc không
tìm được
- Nếu dòng đầu là 1 thì dòng thứ hai ghi chỉ số một phần tử bằng x
Bài 3: Cho file văn bản XAU.INP gồm một số dòng, mỗi dòng ghi một xâu kí tự .
Hãy ghi vào file văn bản XAU.OUT một số dòng, mỗi dòng ghi số 1 hoặc số 0 tùy
theo xâu ở dòng tương ứng của file XAU.INP là xâu đối gương hay không?
10
Ví dụ:
XAU.INP
XAU.OUT
ABCBA
1
ABCDEDCAB
0
MADAM
0
A
1
…..
2.4. TÌM KIẾM THEO CHIỀU SÂU
2.4.1 Ý tưởng
Tư tưởng của thuật toán tìm kiếm theo chiều sâu (DFS) có thể trình bày như
sau:
Trước hết Đỉnh s được đến từ đỉnh s, tiếp theo, với mọi cung (s,x) của đồ thị thì
x cũng sẽ đến được từ s. Với mỗi đỉnh x đó thì tất nhiên những đỉnh y nối từ x cũng
đến được từ s…
Điều đó gợi cho ta viết một thủ tục đệ quy THAMDFS(u) mô tả việt duyệt từ
đỉnh u bằng cách thăm đỉnh u và tiếp tục quá trình duyệt THAMDFS(v) với v là
một đỉnh chưa thăm nối từ u. Ta phải sử dụng kỹ thuật đánh dấu để tránh việc liệt
kê các cặp đỉnh: khởi tạo Avail[v]:=true, ∀ v ∈ V, mỗi lần thăm một đỉnh ta đánh
dấu đỉnh đó lại, avail[v]:=false, để các bước duyệt đệ quy kế tiếp không duyệt lại
đỉnh đó nữa. Để lưu lại đường đi từ đỉnh xuất phát s, trong thủ tục THAMDFS(u),
trước khi gọi đệ quy THAMDFS(v) với v là một đỉnh chưa thăm nối từ u, ta lưu lại
vết đường đi từ u tới v bằng cách đặt trace[v]:=u, tức là trace[v] lưu lại đỉnh liền
trước v trong đường đi từ s tới v. Khi thuật toán DFS kết thúc đường đi từ s tới t sẽ
là: (p1= t ← p2=trace[p1] ← p3= trace[p2] ← …s)
2.4.2. Thủ tục đệ quy THAMDFS
Procedure DFSTHAM(u);
Begin
Avail[u]:=False;
Output ← u;
for ∀ v ∈ V: (u,v) ∈ E do
if avail[v] then
begin
trace[v]:=u;
thamdfs(v);
End;
End;
Begin
Input → Đồ thị G, đỉnh xuất phát s, đỉnh đích t;
For v ∈ V do Avail[v] :=true;
Dfstham(s)
11
if avail[t] then
truy theo vết từ t để tìm đường đi từ s tới t
End.
Kết quả của thuật toán tìm kiếm theo chiều sâu
Một cách tự nhiên, kết quả của giải thuật tìm kiếm theo chiều sâu là một cây phủ
qua tất cả các đỉnh được duyệt của đồ thị.
Duyệt các đỉnh
Có thể dùng giải thuật này để tạo một danh sách tuần tự các đỉnh của một đồ
thị (hoặc cây). Có ba cách hiện thực phương pháp này:
•
Duyệt tiền thứ tự (preordering): tạo ra một danh sách mà trong đó các
đỉnh xuất hiện theo đúng trật tự nó được thăm đến khi chạy thuật toán. Đây
chính là biểu diễn tự nhiên của quá trình thực hiện giải thuật tìm kiếm theo
chiều sâu. Một biểu thức ở dạng tiền thứ tự được gọi là kí pháp tiền tố.
•
Duyệt hậu thứ tự (postordering): tạo ra một danh sách mà trong đó các
đỉnh xuất hiện theo thứ tự của lần duyệt đến sau cùngkhi thực hiện giải thuật.
Một lần duyệt hậu thứ tự một cây biểu thức sẽ cho ra một kí pháp hậu tố.
•
Duyệt đảo hậu thứ tự (reverse postordering): kết quả của cách duyệt
này là sự đảo ngược lại thứ tự trong kết quả duyệt hậu thứ tự. Thông thường,
khi duyệt cây, cách này cho ra cùng kết quả với duyệt tiền thứ tự, nhưng xét
tổng quát, khi duyệt một đồ thị, tiền thứ tự và đảo hậu thứ tự cho ra kết quả
khác nhau. Với các đồ thị có hướng và không có vòng, cách duyệt đảo hậu thứ
tự cho ra một trật tự tô-pô của đồ thị đó.
Độ phức tạp của thuật toán
1.
DFS được gọi đúng 1 lần ứng với mỗi đỉnh.
2.
Mỗi cạnh được xem xét đúng 2 lần, mỗi lần từ một đỉnh kề với nó.
3.
Với ns đỉnh và ms cạnh thuộc thành phần liên thông chứa s, một
phép DFS bắt đầu tại s sẽ chạy với thời gian O(ns + ms)nếu:
•
Đồ thị được biểu diễn bằng cấu trúc dữ liệu dạng danh sách kề.
•
Đặt nhãn cho một đỉnh là "đã thăm" và kiểm tra xem một đỉnh "đã thăm
chưa tốn chi phí O(degree).
•
Bằng cách đặt nhãn cho các đỉnh là "đã thăm", ta có thể xem xét một cách
hệ thống các cạnh kề với đỉnh hiện hành nên ta sẽ không xem xét một cạnh quá 1
lần.
•
Kiểm Ứng dụng giải thuật tìm kiếm theo chiều sâu
Xác định các thành phần liên thông của đồ thị
tra một đồ thị •
có phải là đồ •
Sắp xếp tô-pô cho đồ thị
thị phẳng hay •
Xác định các thành phần liên thông mạnh của đồ thị có hướng
không
12
2.5. TÌM KIẾM THEO CHIỀU RỘNG
Trong lý thuyết đồ thị, tìm kiếm theo chiều rộng (BFS) là một thuật toán tìm
kiếm trong đồ thị trong đó việc tìm kiếm chỉ bao gồm 2 thao tác: (a) thăm một đỉnh
của đồ thị; (b) thêm các đỉnh kề với đỉnh vừa thăm vào danh sách có thể thăm trong
tương lai. Có thể sử dụng thuật toán tìm kiếm theo chiều rộng cho hai mục đích:
tìm kiếm đường đi từ một đỉnh gốc cho trước tới một đỉnh đích, và tìm kiếm đường
đi từ đỉnh gốc tới tất cả các đỉnh khác. Trong đồ thị không có trọng số, thuật toán
tìm kiếm theo chiều rộng luôn tìm ra đường đi ngắn nhất có thể. Thuật toán BFS
bắt đầu từ đỉnh gốc và lần lượt thăm các đỉnh kề với đỉnh gốc. Sau đó, với mỗi đỉnh
trong số đó, thuật toán lại lần lượt thăm các đỉnh kề với nó mà chưa được thăm
trước đó và lặp lại. Xem thêm thuật toán tìm kiếm theo chiều sâu, trong đó cũng sử
dụng 2 thao tác trên nhưng có trình tự thăm các đỉnh khác với thuật toán tìm kiếm
theo chiều rộng.
2.5.1. Ý tưởng:
s
v1
U
U
1
2
V
…
…
Thăm trước tất cả các đỉnh v
Thăm trước tất cả các đỉnh u
2
Tư tưởng của thuật toán tìm kiếm theo chiều rộng BFS là “lập lịch” tất cả các
đỉnh. Việc thăm một đỉnh sẽ lên lịch duyệt các đỉnh nối từ nó sao cho thứ tự duyệt
là ưu tiên chiều rộng (tức là đỉnh nào gần đỉnh xuất phát s hơn sẽ được duyệt
trước). Đầu tiên ta thăm đỉnh s. Việc thăm đỉnh s sẽ phát sinh thứ tự thăm những
đỉnh u1, u2, …nối từ s ( những đỉnh gần s nhất). Tiếp theo ta thăm đỉnh u 1, khi thăm
u1 sẽ lại phát sinh yêu cầu thăm các đỉnh v 1,v2,…nối từ u1. Nhưng rõ ràng các đỉnh v
này xa s hơn những đỉnh u nên chúng chỉ được thăm khi tất cả những đỉnh u đã
thăm. Tức thứ tự duyệt sẽ là: s, u1, u2, ...,v1, v2,...
Thuật toán tìm kiếm theo chiều rộng chỉ sử dụng một danh sách để chứa những
đỉnh đang chờ thăm. Tại mỗi bước, ta thăm một đỉnh đầu danh sách, loại nó ra khỏi
danh sách và cho những đỉnh chưa xếp hàng kế với nó xếp hàng thêm vào cuối
danh sách. Thuật toán sẽ kết thúc khi danh sách rỗng.
Vì nguyên tắc vào trước ra trước, danh sách chứa những đỉnh đang chờ thăm
được tổ chức dưới dạng hàng đợi (Queue): Nếu ta có Queue là một hàng đợi với
thủ tục PUSH(v) để đẩy một đỉnh v vào hàng đợi và hàm POP trả về một đỉnh lấy
ra từ hàng đợi thì mô hình của giải thuật BFS ta có thể viết.
13
2.5.2. Giải thuật
Queue:=(s)
For ∀ v ∈ V do
Avail[v]:=true;
Avail[s]:=false;
Repeat
U:=POP;
Output ← u;
For ∀ v ∈ V:avail[v] and (u,v) ∈ E do
Begin
Trace[v]:=u;
Push(v);
Avail[v]:=false;
End;
Until Queue = φ ;
If avail [t] then
Truy theo vết từ t để tìm đường đi từ s tới t;
Trong quá trình lập trình ta thướng gặp các dạng toán tìm kiếm có thể ứng dụng
thuật toán trên, Ví dụ: Bài toán : HẸN GẶP MẶT
Hòa và Thân là bạn thân của nhau, hai người xa nhau đã lâu, nay mới liên lạc
được với nhau qua Internet và họ hẹn gặp nhau tại thành phố Hồ Chí Minh. Họ
quyết định đến gặp nhau bằng cách đi máy bay để tiết kiệm thời gian. Hoà và Thân
sinh sống và làm việc tại hai thành phố khác nhau.
Hãy tìm cách giúp Hòa và Thân đến được thành phố Hồ Chí Minh bằng các
chuyến bay có thể có nhưng để tiết kiệm chi phí, tại mỗi sân bay mỗi người chỉ
được ghé lại 1 lần và mỗi người phải qua ít thành phố nhất.
Các thành phố xem như là các đỉnh của một đồ thị vô hướng gồm N đỉnh
được mã số từ 1 đến N (1 ≤ i ≤ 100). Chỉ một số cặp thành phố mới có đường bay
còn lại thì không. Giả sử đỉnh xuất phát không trùng đỉnh đích.
Dữ liệu vào: được cho trong tệp GAPNHAU.INP gồm có các dòng:
- Dòng đầu tiên, được gọi là dòng 0, chứa 4 số tự nhiên N, H, T, D(1≤ H,T,D≤ N),
trong đó N là số thành phố có sân bay, H là nơi Hoà đang sinh sống và công tác còn
T là thành phố mà Thân sống và làm việc, D là mã số của thành phố Hồ Chí Minh
nơi mà Hoà và Thân hẹn gặp. (các số cách nhau ít nhất 1 khoảng cách)
- Dòng thứ i (1 ≤ i ≤ N - 1), trong N-1 dòng tiếp theo cho biết có hay không đường
bay nối thành phố i với thành phố j (j=N-j+1) bằng các số 0, 1 (số 0 nghĩa là không
có đường bay giữa hai đỉnh i , j; số 1 nghĩa là tồn tại đường bay giữa hai đỉnh i , j)
các số cách nhau ít nhất 1 khoảng cách.
14
Ví dụ:
GAPNHAU.INP
9627
10111000
1100000
000100
01100
0000
000
00
1
GAPNHAU.OUT
33
647
237
1
2
3
8
7
5
6
41
9
- Dòng 0: 9 6 2 7 - Có 9 đỉnh mã số từ 1 đến 9, cần tìm đường đi từ đỉnh 6 đến đỉnh
7 và từ đỉnh 2 đến đỉnh 7.
- Dòng 1: 1 0 1 1 1 0 0 0 - đỉnh 1 được nối với các đỉnh 2, 4, 5, và 6. Không có
cạnh nối đỉnh 1 với các đỉnh 3, 7, 8 và 9.
- Dòng 2: 1 1 0 0 0 0 0 - đỉnh 2 được nối với các đỉnh 3 và 4. Không có cạnh nối
đỉnh 2 với các đỉnh 5, 6, 7, 8 và 9.
- ...
- Dòng 8: 1 – đỉnh 8 có nối với đỉnh 9.
Vì đồ thị là vô hướng nên cạnh nối đỉnh x với đỉnh y cũng chính là cạnh nối
đỉnh y với đỉnh x. thông tin về đỉnh N không cần hiển thị vì với mỗi đỉnh i ta chỉ
liệt kê các đỉnh j>i tạo thành đường đi (i,j).
Dữ liệu ra: được ghi trong tệp văn bản GAPNHAU.OUT:
- Dòng đầu tiên ghi số tự nhiên k, l là số đỉnh trên đường đi từ H đến D và số đỉnh
trên đường từ T tới D (nếu không có đường đi thì ghi số 0).
- Dòng thứ 2 ghi lần lượt các đỉnh có trên đường đi từ H đến D. (Nếu không có
thì ghi 0)
- Dòng thứ 3 ghi lần lượt các đỉnh có trên đường đi từ T đến D. (Nếu không có thì
ghi 0)
* Cài đặt thuật toán:
Xuất phát từ đỉnh v[1] = s, mỗi bước lặp i ta thực hiện các kiểm tra sau. Gọi
k là số đỉnh đã đi qua và được tích luỹ trong mảng giải trình đường đi v, cụ thể là
xuất phát từ đỉnh v[1] = s, sau một số lần duyệt ta quyết định chọn đường đi qua
các đỉnh v[1], v[2], v[3],…, v[k]. Có thể gặp các tình huống sau:
a) (Đến đích?) nếu v[k] = t tức là đã đến được đỉnh t: thông báo kết quả,
dừng thuật toán, ngược lại thực hiện b.
b) (Thất bại?) k = 0: nếu đã quay trở lại vị trí xuất phát v[i] = s mà từ đó
không còn đường đi nào khác thì phải lùi một bước nữa, do đó k = 0. Trường hợp
15
này chứng tỏ bài toán vô nghiệm, tức là, do đồ thị không liên thông nên không có
đường đi từ đỉnh s đến đỉnh t. Ta thông báo vô nghiệm và dừng thuật toán.
c) (Đi tiếp?) nếu từ đỉnh v[k] tìm được một cạnh chưa đi qua và dẫn đến một
đỉnh i nào đó thì tiến theo đường đó, nếu không: thực hiện bước d.
d) (Lùi một bước) Bỏ đỉnh v[k], lùi lại đỉnh v[k-1].
Nhận xét: Thuật toán trên có tên là sợi chỉ Arian được phỏng theo một
truyền thuyết cổ Hy Lạp sau đây. Anh hùng Te-dây phải tìm diệt con quái vật nhân
ngưu (đầu người, mình trâu) Minotav ẩn náu trong một phòng của mê cung có
nhiều ngõ ngách rắc rối đã từng làm lạc bước nhiều dũng sĩ và những người này
đều trở thành nạn nhân của Minotav. Người yêu của chàng Te-dây là công chúa của
xứ Mino đã đưa cho chàng một cuộn chỉ và dặn chàng như sau: Chàng hãy buộc
một đầu chỉ vào cửa mê cung (phòng xuất phát s), sau đó, tại mỗi phòng trong mê
cung, chàng hãy tìm xem có Minotav ẩn trong đó không. Nếu có, chàng hãy chiến
đấu dũng cảm để hạ thủ nó rồi cuốn chỉ quay ra cửa hang, nơi em trông ngóng
chàng. Nếu chưa thấy Minotav tại phòng đó, chàng hãy kiểm tra xem chỉ có bị rối
hay không. Cuộn chỉ bắt đầu rối khi nào từ phòng chàng đứng có hai sợi chỉ đi ra
hai cửa khác nhau. Nếu chỉ rối như vậy, chàng hãy cuộn chỉ để lùi lại một phòng và
nhớ đánh dấu đường đã đi để khỏi lạc bước vào đó lần thứ hai.
Nếu không gặp chỉ rối thì chàng hãy yên tâm dò tìm một cửa chưa đi để qua
phòng khác. Đi đến đâu chàng nhớ nhả chỉ theo đến đó. Nếu không có cửa để đi
tiếp hoặc từ phòng chàng đang đứng, mọi cửa ra đều đã được chàng đi qua rồi, thì
chàng hãy cuốn chỉ để lùi lại một phòng rồi tiếp tục tìm cửa khác.
Ta xuất phát từ sơ đồ tổng quát cho lớp bài toán quay lui.
Thí sinh tuỳ ý kết hợp thuật toán trên cùng lúc cho 2 vị trí xuất phát đỉnh
khác nhau hoặc thực hiện riêng lẽ việc tìm đường đi cho mỗi đỉnh xuất phát.
Thuật toán sử dụng một cấu trúc dữ liệu hàng đợi để lưu trữ thông tin trung gian
thu được trong quá trình tìm kiếm:
1. Chèn đỉnh gốc vào hàng đợi
2. Lấy ra đỉnh đầu tiên trong hàng đợi và thăm nó
• Nếu đỉnh này chính là đỉnh đích, dừng quá trình tìm kiếm và trả về kết
quả.
• Nếu không phải thì chèn tất cả các đỉnh kề với đỉnh vừa thăm nhưng chưa
được thăm trước đó vào hàng đợi.
3. Nếu hàng đợi là rỗng, thì tất cả các đỉnh có thể đến được đều đã được
thăm – dừng việc tìm kiếm và trả về "không thấy".
4. Nếu hàng đợi không rỗng thì quay về bước 2.
* Vậy ta có chương trình sau:
(* ----------------------------------------
16
(Thuat toan Arian)
s: dinh xuat phat
t: dinh ket.
------------------------------------------*)
procedure MC;
var i: byte;
begin
Doc; {doc du lieu}
{---------------------------khoi tao mang d,
danh dau cac dinh da tham:
d[i] = 1: dinh da tham
d[i] = 0: dinh chua tham
-----------------------------}
fillchar(d,sizeof(d),0);
k := 1; {k – dem so dinh da chon }
v[k] := s; {dinh xuat phat }
d[s] := 1; {da tham dinh s }
repeat
if v[k] = t then {den dich }
begin
ket(k); {ghi ket qua: giai trinh duong di }
exit;
end;
if k < 1 then {vo nghiem }
begin
ket(0);
exit;
end;
i := Tim;
{tu dinh v[k] tim 1 dinh chua tham i }
if i > 0 then
{neu tim duoc, i > 0, di den dinh i }
NhaChi(i)
else CuonChi;
{neu khong tim duoc, }
{ i = 0: lui 1 buoc - bo dinh v[k] }
until false;
end;
17
Ghi chú: Nếu sử dụng một ngăn xếp thay vì hàng đợi thì thuật toán trở thành
thuật toán tìm kiếm theo chiều sâu.
Các đặc tính của thuật toán
Không gian
Nếu V là tập hợp đỉnh của đồ thị và
là số đỉnh thì không gian cần dùng của
thuật toán là
.
Thời gian
Nếu V, và E là tập hợp các đỉnh và cung của đồ thị, thì thời gian thực thi của
thuật toán là
vì trong trường hợp xấu nhất, mỗi đỉnh và cung của đồ
thị được thăm đúng một lần. Ghi chú:
nằm trong khoảng từ
đến
, tùy theo số cung của đồ thị.
Ứng dụng của thuật toán tìm kiếm theo chiều rộng
Thuật toán tìm kiếm theo chiều rộng được dùng để giải nhiều bài toán trong lý
thuyết đồ thị, chẳng hạn như:
• Tìm tất cả các đỉnh trong một thành phần liên thông
• Thuật toán Cheney cho việc dọn rác
• Tìm đường đi ngắn nhất giữa hai đỉnh u và v (với chiều dài đường đi tính
bằng số cung)
• Kiểm tra xem một đồ thị có là đồ thị hai phía
• Thuật toán Cuthill–McKee
• Thuật toán Ford–Fulkerson để tìm luồng cực đại trong mạng
Tìm các thành phần liên thông
Tập hợp các đỉnh được thăm bởi thuật toán tìm kiếm theo chiều rộng chính là
thành phần liên thông chứa đỉnh gốc.
Kiểm tra đồ thị hai phía
Có thể dùng thuật toán tìm kiếm theo chiều rộng để kiểm tra xem một đồ thị có
phải đồ thị hai phía hay không, bằng cách tìm kiếm từ một đỉnh bất kì và gán nhãn
chẵn lẻ cho các đỉnh được thăm. Nghĩa là, gán nhãn 0 cho đỉnh gốc, 1 cho tất cả các
đỉnh kề đỉnh gốc, 0 cho tất cả các đỉnh kề với một đỉnh kề đỉnh gốc, và tiếp tục như
vậy. Nếu ở một bước nào đó, có hai đỉnh kề nhau có cùng nhãn, thì đồ thị không là
hai phía. Nếu quá trình tìm kiếm kết thúc mà điều này không xảy ra thì đồ thị là hai
phía.
2.4. HIỆU QUẢ CỦA SÁNG KIẾN KINH NGHIỆM ĐỐI VỚI HOẠT ĐỘNG
GIÁO DỤC
Trong khi tiến hành thực hiện sáng kiến kinh nghiệm tôi đã suy nghĩ ngoài
việc tìm tòi những thuật toán tối ưu cho việc giải quyết bài toàn thì tôi còn phải tìm
những phương pháp tạo cảm hứng cho học sinh. Từ đó khi vận dụng vào ôn luyện
đội tuyển các em khá hứng thú và tiếp thu bài giảng cũng tốt hơn.
18
Trong thực tiển bài toán tìm kiếm khá phổ biến, các bài toán này cũng
thường xuyên xuất hiện nhiều ở các bài thi chọn học sinh giỏi Tỉnh. Vì vậy tôi đã
sưu tầm được tương đối các bài tập dạng này, giúp các em ôn luyện tốt hơn.
Trên cơ sở lý thuyết kết hợp với những bài tập mà tôi đã sưu tầm, tôi đã chia
sẽ cùng với đồng nghiệp trong nhóm Tin học của trường, giúp các đồng chí có thêm
kiến thức và tại liệu để có thể vững vàng đứng đội tuyển.
Dưới đây là kết quả ứng dụng sáng kiến vào dậy 2 lớp Ban tự nhiên ở các năm
Giỏi
Khá
TB
Yếu
Năm
Lớp Sĩ số
học
SL
%
SL
%
SL
%
SL
%
11T2
43
14
32.5
16
37.2
10
23.2
3
7.1
201211T3
43
18
41.8
15
34.8
7
16.4
3
7.0
2013
Tổng
86
32
37.2
31
36
17
19.8
6
7
11A1
41
17
40.5
17
41.5
6
14.6
1
2.4
201311A2
44
30
68.2
11
25.0
2
4.5
1
2.2
2014
Tổng
85
47
55.3
28
32.9
8
9.4
2
2.4
11A1
41
15
36.5
17
41.5
8
19.6
1
2.4
201511A2
41
27
65.8
13
31.7
1
2.4
0
0.0
2016
Tổng
82
42
51.2
30
36.6
9
11
1
1.2
Số liệu từ bảng trên là kết quả thực nghiệm của 3 năm học 2012-2013, 20132014, 2015-2016 đem so sánh với kết quả các năm trước đó chưa áp dụng thực
nghiệm theo cách này thì thấy:
+ Các em học tốt hơn trông thấy: cụ thể là tích cực tìm tòi hơn, hợp tác tốt hơn, chủ
động tìm hiểu các nội dung hơn.
+ Biết vận dụng kiến thức thuật toán tìm kiếm áp dụng vào giải các bài toán đa
dạng và phức tạp.
+ Kết quả học sinh giỏi: dễ dàng bồi dưỡng để học sinh đậu được học sinh giỏi tỉnh
nhiều hơn.
+ Kinh nghiệm sử dụng thuật toán tìm kiếm áp dụng vào dạy lập trình tin học cho
học sinh đã làm tăng hiệu quả chuyên môn cho môn tin học hơn.
Ở trường bản thân tôi đã ứng dụng nội dung trong đề tài và đạt một số kết quả
nhất định trong kỳ thi học sinh giỏi cấp Tỉnh và thi Tin học trẻ không chuyên tỉnh
Thanh Hóa đó là: 1 giải 3 và 3 giải khuyến khích
19
III.KẾT LUẬN VÀ KIẾN NGHỊ
3.1. KẾT LUẬN
Hiện nay, ngôn ngữ lập trình Pascal đã trở thành ngôn ngữ lập trình phổ biến
nhất trên thế giới sử dụng trong lĩnh vực giảng dạy. Trong quá trình giảng dạy các
thầy cô có thể đưa ra các tình huống tìm kiếm dưới dạng các bài tập liên quan đến
cuộc sống…để các em có thể chứng tỏ được khả năng của mình làm cho học sinh
yêu thích môn học, ham học hỏi và tìm tòi sáng tạo.
Với sang kiến này mang tính thực tiễn cao cụ thể là: trong các đề thi học sinh
giỏi các em học sinh đã chủ động để tìm phương pháp qua đó giải quyết được vấn
đề do yêu cầu đề thi hoặc giáo viên đặt ra. Trong quá trình giải quyết vấn đề, giáo
viên chỉ ra những sai lầm thuật toán tìm kiếm cho các em học sinh mắc phải do
hiểu không rõ vấn đề giúp cho các em hiểu rõ hơn về thuật toán tìm kiếm một cách
tổng quát để từ đó học sinh giải quyết được tất cả các dạng toán gặp phải.
Kết quả là có rất nhiều em đã dễ dàng vận dụng được các phương pháp thuật
toán để giải nhiều bài toán con, nhiều dạng khác do các đề thi đặt ra.
3.2. KIẾN NGHỊ
Sở giáo dục và đào tạo Thanh Hóa có thể tập hợp các thầy cô giáo có nhiều
năm kinh nghiệm ôn luyện học sinh giỏi ở các trường, viết ra một cuốn cẩm nang
về kinh nghiệm và các bài tập tham khảo để cho các giáo viên trẻ học hỏi.
Quá trình thực hiện đề tài do nhiều yếu tố chủ quan và khách quan nên không
thể tránh khỏi thiếu sót mong bạn bè đồng nghiệp đóng góp ý kiến để đề tài được
tốt hơn và có nhiều ứng dụng trong dạy học bồi dưỡng học sinh giỏi lớp 11 và hơn
thể nữa là có thể ứng dụng rộng rãi ở các trường THPT. Xin chân thành cảm ơn các
bạn bè đồng nghiệp và các em học sinh đã giúp đỡ và tạo động lực cho tôi hoàn
thành sang kiến này!
XÁC NHẬN CỦA THỦ TRƯỞNG ĐƠN VỊ
Sầm Sơm, ngày 20 tháng 03 năm 2017
Tôi cam đoan sáng kiến kinh nghiệm
của tôi là do tôi viết ra, không sao chép của
người khác. Nếu sai tôi xin chịu mọi trách
nhiệm.
Người viết SKKN
Nguyễn Hữu Dũng
20
TÀI LIỆU THAM KHẢO
1. Lê Văn Doanh, Trần Khắc Tuấn- 101 Thuật toán và chương trình-NXB Khoa
Học Kỹ Thuật.
2. Quách Tuấn Ngọc - Bài tập ngôn ngữ lập trình Pascal-NXB Thống Kê.
3. PGS.PTS Bùi Thế Tâm - Bài tập lập trình Turbo Pascal 7.0-NXB Giao Thông
Vận Tải.
4. Hồ Sĩ Đàm-Tin học 10,11 - NXB Giáo Dục.
5. Ths Trần Đức Huyên - Phương pháp giải các bài toán trong tin học - NXB
Giáo dục
6. Hồ sĩ Đàm - Tài liệu chuyờn tin học - NXB Giáo Dục
7. Một số đề thi, kiểm tra của các tỉnh trên toàn quốc
21
MỘT SỐ ĐỀ THAM KHẢO
Sau khi áp dụng giáo án trên dạy xong cho học sinh. Để khẳng định tính đúng đắn
của phương pháp nghiên cứu và nâng cao hiệu quả của đề tài tôi có thể đề nghị
một số đề thi cho học sinh để học sinh tự rèn luyện, phát triển năng lực, hoàn thiện
kiến thức lập trình của mình, trong đề thi này có thể lấy từ các tài liệu liên quan,
hoặc các đề thi học sinh giỏi qua các năm học… để học sinh áp dụng, tham khảo.
Từ đó cho kết quả cao nhất.
ĐỀ KIỂM TRA 001:
Bài 1: (4,0 điểm)
Tách từ
Cho 1 xâu gồm nhiều từ (các từ cách nhau bởi ký tự trắng, xâu không dài quá 256
ký tự), hãy tách các từ ra từ xâu.
Dữ liệu vào từ tệp văn bản: Tachtu.inp:
Gồm 1 dòng là xâu cần tách
Dữ liệu ra tệp văn bản: Tachtu.out. Gồm nhiều dòng
Mỗi dòng là 1 từ tách được từ xâu, theo thứ tự từ trái qua phải
Ví dụ
Tachtu.inp
Tachtu.ou
Tachtu.inp
Tachtu.ou
t
t
Cong hoa xa hoi Cong
G i a o vien G
hoa
i
xa
a
hoi
o
vien
Bài 2: (5,5 điểm)
Số lõm
Cho mảng A kích thước MxN (M,N ≤ 100; -2000 ≤ Aij ≤ 2000). Phần tử Aij được
gọi là phần tử lõm nếu nó là phần tử nhỏ nhất trong hàng của nó đồng thời là phần
tử nhỏ nhất trong cột của nó.
Hãy lập chương trình tìm phần tử lõm sâu nhất của mảng A? (Phần tử lõm sâu
nhất là phần tử có giá trị nhỏ nhất trong các phần tử lõm)
Dữ liệu vào từ tệp solom.inp gồm M dòng, mỗi dòng có N giá trị Aij, các giá trị
các nhau 1 ký tự trắng
Dữ liệu ra tệp solom.out, một dòng ghi 2 giá trị là số dòng, số cột của phần tử lõm
sâu nhất, các giá trị cách nhau 1 ký tự trắng. Nếu không tìm được thì ghi -1
Ví dụ
Solom.inp
Solom.out
15 5 9
33
55 4 6
76 7 2
22
Bài 3: (3,5 điểm)
Tên thiêng
Tại một bộ tộc nọ các thành viên trong bộ tộc đều được đặt tên theo 1 qui tắc
chung, đó là:
Tộc trưởng đưa ra 1 tập hợp có n ký tự thiêng dùng để đặt tên (n ≤ 125)
Tên các thành viên trong bộ tộc được đặt không trùng nhau và mỗi tên được
tạo nên từ tất cả các ký tự thiêng theo một thứ tự nào đó.
Yêu cầu: cho 1 tập các ký tự thiêng, hãy giúp bộ tộc đưa ra tất cả các tên được tạo
ra từ tập ký tự thiêng, theo quy tắc của bộ tộc.
Dữ liệu vào từ tệp: Tenth.inp gồm 1 dòng là các ký tự thiêng, mỗi ký tự cách nhau
một ký tự trắng
Dữ liệu ra tệp: Tenth.out gồm nhiều dòng, mỗi dòng là một tên thiêng
Ví dụ:
Tenth.inp
Tenth.out
Tenth.inp
Tenth.out
abc
Abc
xy
xy
acb
yx
bac
bca
cab
cba
ĐỀ 002: (Trích đề thi HSG Nam Định 2009-2010)
Bài 1: (6 điểm) Giả thuyết của GÔN – BẮC
Giả thuyết của GÔN – BẮC ( Cho đến nay vẫn chưa bị bác bỏ, nhưng cũng chưa
chứng minh được đầy đủ) nói rằng mỗi số chẵn n lớn hơn 2 là tổng của hai số
nguyên tố.
Yêu cầu: Cho số n chẵn lớn hơn 2, hãy xác định số lượng các cặp số nguyên tố có
tổng bằng số n.
Kết quả : Đưa ra tệp văn bản GONBAC.OUT chứa duy nhất một số theo yêu cầu
của bài.
Ví dụ :
GONBAC.INP
GONBAC.OUT
16
2
Bài 2: (4 điểm) Mua hàng
Có n người xếp thành hàng theo thứ tự để mua hàng. Thòi gian người bán hàng
phục vụ cho người thứ i là ti đơn vị thời gian. Hãy tìm thời gian mà người thứ k
phải chờ để mua hàng.
Dữ liệu: Vào từ tệp văn bản MH.INP
- Dòng 1: chứa 2 số n, j nguyên dương (1≤k≤n≤100);
23
- Dòng 2: chứa n số t1, t2,...tn ( Các giá trị ti đều nguyên dương va nhỏ hơn 1000).
Kết qủa : Đưa ra tệp văn bản MH.OUT chứa duy nhất số C thở mãn yêu cầu của
dữ liệu vào.
Ví dụ:
MH.INP
MH.OUT
53
13241
4
ĐỀ 003: (ĐỀ THI HSG TỈNH ĐẮCLAK 2011-2012)
Bài 1: Tính tổng (5 điểm).
Trên một màn hình lớn, người ta lần lượt cho hiện ra các số của một dãy gồm
N số nguyên không âm a1, a2, …, aN và cứ lặp đi lặp lại như thế (nghĩa là sau khi a i
xuất hiện vài giây đến lượt ai+1 xuất hiện, số xuất hiện sau aN là a1).
Yêu cầu: Bạn được đề nghị tính tổng của K số nguyên liên tiếp xuất hiện trên
màn hình bắt đầu từ số nguyên thứ B.
Dữ liệu vào: Chứa trong file BAI1.INP gồm hai dòng:
+ Dòng đầu tiên ghi ba số nguyên N, K, và B, 1 ≤ N ≤ 104; 1 ≤ K ≤ 2. 104 ; 1 ≤
B ≤ 109.
+ Trong N dòng sau, dòng thứ i chứa số ai (ai < 2.109).
Dữ liệu ra: Ghi ra file BAI1.OUT một số là tổng tìm được.
Ví dụ:
BAI1.INP
BAI1.OUT
5 76
32
2
3
6
7
9
Bài 2(6 điểm) - Siêu nguyên tố
Số siêu nguyên tố là số nguyên tố mà khi bỏ một số tuỳ ý các chữ số bên phải
của nó thì phần còn lại vẫn tạo thành một số nguyên tố.
Ví dụ 7331 là một số siêu nguyên tố có 4 chữ số vì 733, 73, 7 cũng là các số
nguyên tố.
Viết chương trình nhập dữ liệu vào là một số nguyên N (0< N <10) và đưa ra kết
quả là các số siêu nguyên tố có N chữ số cùng số lượng của chúng.
Bài 3(9 điểm) -Tô màu
Cho một bảng gồm các ô vuông kích thước M x N (M, N ≤ 100), trong đó có một
số ô đen, còn lại là các ô trắng.
24
Yêu cầu: Hãy tô màu tất cả các ô trắng bằng hai màu xanh và vàng sao cho trên
mỗi dòng cũng như trên mỗi cột số các ô màu xanh và vàng lệch nhau không quá 1.
Dữ liệu vào: Được cho trong file văn bản BAI3.INP
- Dòng đầu ghi hai số M, N
- M dòng tiếp theo mỗi dòng ghi N số, gồm các số 0 hoặc 1 biểu diễn bảng ô
vuông, với 0 biểu thị ô trắng, 1 biểu thị ô đen.
Kết quả: Ghi ra file văn bản BAI3.OUT gồm M dòng, mỗi dòng gồm N ký tự viết
liền nhau biểu diễn trạng thái màu đã tô của bảng với D: màu đen, X: màu xanh, V:
màu vàng.
Ví dụ:
BAI3.INP
BAI3.OUT
64
DVDX
1010
DXXV
1000
XDVD
0101
DDVX
1100
VDXD
0101
DXDV
1010
ĐỀ 004: (TRÍCH ĐỀ THI HSG HẢI DƯƠNG 2012-2013)
Bài 1: Trong dịp nghỉ hè, bé Mai được bố mẹ cho đi tắm biển. Trên bờ biển bé
nhặt được N viên đá cuội rất đẹp mắt. Mai quyết định vẽ trên cát một lưới hình chữ
nhật kích thước a x b (a, b nguyên dương) được chia thành a x b ô vuông bằng các
đường ngang dọc sao cho có thể rải N hòn sỏi này vào các ô vuông sao cho mỗi ô
vuông có nhiều nhất một viên sỏi.
Hãy giúp bé Mai chọn kích thước của hình chữ nhật sao cho chu vi của nó là nhỏ
nhất. In ra màn hình giá trị chu vi này.
Dữ liệu: Nhập vào từ bàn phím số nguyên dương N (N ≤ 109).
Kết quả: Ghi ra màn hình chu vi của hình chữ nhật tìm được
Ví dụ:
Dữ liệu nhập vào: 15
Kết quả in ra: 16
Giải thích: Hình chữ nhật tìm được có kích thước 4 x 4
Bài 2: Xét một số N có 4 chữ số và không phải tất cả các chữ số đều giống nhau.
Phép tính độ lệch được thực hiện như sau:
• Tạo số thứ nhất N1 bằng cách xếp các chữ số theo trình tự giảm dần
• Tạo số thứ hai N2 bằng cách xếp các chữ số theo trình tự tăng dần (nếu có
chữ số 0 ở đầu thì N2 sẽ không phải là số có 4 chữ số)
• Tính hiệu N1-N2 và gán lại cho N
Các bước trên được thực hiện cho đến khi nhận được số N là 6174 hoặc 0
Ví dụ: Nếu N=1023
• Ở bước 1: N1=3210, N2=123, N=N1-N2=3087
25