1. Trang chủ
  2. » Tất cả

Skkn giải các dạng bài toán liệt kê bằng phương pháp vét cạn sử dụng thuật toán quay lùi trong ôn luyện học sinh giỏi môn tin học

23 1 0

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HÓA TRƯỜNG THPT TRIỆU SƠN 2 SÁNG KIẾN KINH NGHIỆM GIẢI CÁC DẠNG BÀI TOÁN LIỆT KÊ BẰNG PHƯƠNG PHÁP VÉT CẠN SỬ DỤNG THUẬT TOÁN QUAY LUI TRONG ÔN LUYỆN HỌC SINH GIỎI MÔN TIN[.]

SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HÓA TRƯỜNG THPT TRIỆU SƠN SÁNG KIẾN KINH NGHIỆM GIẢI CÁC DẠNG BÀI TOÁN LIỆT KÊ BẰNG PHƯƠNG PHÁP VÉT CẠN SỬ DỤNG THUẬT TỐN QUAY LUI TRONG ƠN LUYỆN HỌC SINH GIỎI MÔN TIN HỌC Người thực hiện: Phạm Thị Biên Chức vụ: Giáo viên SKKN thuộc môn: Tin học THANH HÓA NĂM 2014 skkn MỤC LỤC A ĐẶT VẤN ĐỀ I Lý chọn đề tài II Thực trạng vấn đề .3 III Mục đích nghiên cứu .4 IV Đối tượng phạm vi nghiên cứu B GIẢI QUYẾT VẤN ĐỀ I Cơ sở lý luận .5 II Biện pháp giải vấn đề Một số khái niệm .5 Một số dạng toán liệt kê .7 Một số toán tham khảo .19 III Kết thực nghiệm 19 C KẾT LUẬN VÀ ĐỀ XUẤT 20 I Kết luận .20 II Đề xuất, kiến nghị 20 skkn A ĐẶT VẤN ĐỀ I LÝ DO CHỌN ĐỀ TÀI Trong thời đại ngày nay, giới diễn trình tin học hóa nhiều lĩnh vực hoạt động xã hội Tin học phát triển nhanh vũ bão trở thành ngành khoa học đóng vai trị quan trọng khơng thể thiếu phát triển xã hội Nhiều quốc gia ý thức tầm quan trọng tin học có đầu tư lớn vào lĩnh vực đặc biệt lĩnh vực giáo dục nhằm đào tạo đội ngũ tri thức trẻ có tảng tin học vững vàng nhằm đáp ứng nhu cầu ngày cao xã hội Từ năm 2006 ngành giáo dục Việt Nam thức đưa mơn tin học vào trường THPT nhằm mục đích phổ cập kiến thức Tin học, ngồi cịn giúp học sinh có khả phân tích, tổng hợp, trừu tượng hóa, khái quát hóa vấn đề, đặc biệt phát triển khả tư Muốn việc dạy đại trà, hướng nghiệp dạy nghề cần tạo điều kiện cho học sinh có khiếu tin học phát triển khả lập trình để giải tốt tốn Để phát huy tài tin học thông qua ôn luyện đội tuyển học sinh giỏi, đòi hỏi người dạy phải tiếp cận với nhiều dạng tốn khó nắm vững phương pháp giải tốn Bài tốn tin học thường đa dạng phức tạp, toán có nhiều phương pháp giải khác Để lựa chọn phương pháp thích hợp cho tốn, phân chia tốn thành dạng toán tổng quan phương pháp giải cho dạng tốn Bài toán liệt kê lớp toán khó, thường xuất đề thi học sinh giỏi cấp thành phố, cấp tỉnh hay cấp quốc gia Có nhiều phương pháp giải lớp tốn phương pháp vét cạn phù hợp Chính nên chọn đề tài: “Giải dạng toán liệt kê phương pháp vét cạn sử dụng thuật tốn quay lui ơn luyện học sinh giỏi môn Tin học” II THỰC TRẠNG CỦA VẤN ĐỀ Thuận lợi Do quan tâm đầu tư Bộ giáo dục đào tạo nói chung trường THPT Triệu Sơn nói riêng, sở vật chất mơn Tin học có phịng thực hành hoạt động tốt, ngồi cịn có số phòng máy chiếu projector hỗ trợ cho giáo viên công tác giảng dạy Mặc dù môn Tin môn trọng điểm Ban giám hiêu quan tâm động viên tạo điều kiện công tác giảng dạy ôn luyện đội tuyển học sinh giỏi công tác khác Trong q trình thực đề tài tơi giáo viên tổ môn tư vấn hỗ trợ nhiều giúp tơi hồn thành đề tài skkn Khó khăn Ngơn ngữ lập trình Pascal mơn học mới, cách học hồn tồn mới, tiếp cận với mơn học đa số học sinh thấy bỡ ngỡ Học thao tác sử dụng hay dùng phương pháp học thuộc lịng khơng cịn phù hợp Lúc em cần phải học cách tư logic, tìm thuật tốn, viết dịng lệnh máy tính xác đến đấu chấm, dấu phẩy Với tâm lí thơng thường em học sinh coi tin học môn phụ không quan trọng nên nhiều em chủ quan không dành đủ thời gian để học nên không hiểu dần bị Đây lí mà nhiều em bị điểm kém, chí thi lại, học lại môn tin học em học giỏi mơn học khác Chính xem mơn Tin mơn phụ nên lựa chọn đội tuyển ôn thi học sinh giỏi giáo viên chúng tơi thường khó lựa chọn học sinh có khiếu thực Các dạng tốn liệt kê tốn khó, người học có tư chưa tốt người dạy khó khăn q trình truyền đạt để giúp em hiểu Kết thực trạng Trước vào nghiên cứu thực đề này, thường hướng dẫn học sinh tiếp cận với toán liệt kê cách cho tập cách giải với mà không phân chia thành dạng cụ thể thuật toán tổng quan cho dạng, dẫn đến học sinh mơ hồ, khó hiểu Kết khảo sát q trình giảng dạy thơng qua kiểm tra sau: Nội d u n g cần n ắm bắt Số lượng Nắm kiến thức vừa học 3/6 Tự viết lại chương trình giới thiệu 3/6 Vận dụng kiến thức học để làm tốt 1/6 tập Tỉ lệ (%) 50% 50% 16,7% skkn B GIẢI QUYẾT VẤN ĐỀ I CƠ SỞ LÝ LUẬN Bài tốn liệt kê (hay cịn gọi tốn cấu hình tổ hợp) toán cho trước tập đối tượng, yêu cầu cho biết có đối tượng thỏa mãn điều kiện định rõ cấu hình tìm thỏa mãn điều kiện Bài tốn liệt kê gồm có dạng: tổ hợp, chỉnh hợp lặp chỉnh hợp khơng lặp Trong dạng tốn chỉnh hợp khơng lặp thường hay xuất nhiều toán tin học Sơ lược số kiến thức đại số tổ hợp: Cho S tập hữu hạn gồm n phần tử số tự nhiên k Gọi X tập hợp số nguyên dương từ đến k: X= {1, 2, …, k}  Tổ hợp Một tổ hợp chập k n tập k phần tử tập n phần tử Chẳng hạn tập {1,2,3,4} có tổ hợp chập là: {1,2}, {1,3, {1,4}, {2,3}, {2,4}, {3,4} Vì tập hợp phần tử khơng phân biệt thứ tự nên tập {1,2} tập {2,1} đó, ta coi chúng tổ hợp Vậy số tổ hợp chập k S gồm n phần tử là:  Chỉnh hợp lặp Chỉnh hợp lặp chập k n dãy k thành phần, thành phần phần tử tập n phần tử, có xét đến thứ tự khơng yêu cầu thành phần khác Số chỉnh hợp lặp chập k n phần tử nk  Chỉnh hợp không lặp Khác với chỉnh hợp lặp thành phần phép lặp lại, tức giống nhau, chỉnh hợp không lặp chập k tập n phần tử dãy k thành phần lấy từ tập n phần tử có xét thứ tự thành phần không phép giống Chẳng hạn có n người, cách chọn k người để xếp thành hàng chỉnh hợp không lặp chập k n Số chỉnh hợp không lặp chập k n phần tử là: n(n-1)(n-2)…(n-k+1)= Để giải toán liệt kê cần xác định thuật tốn tổng quan để sở xây dựng tất cầu hình liên quan Khi vào giải toán liệt kê, yêu cầu cấu hình tìm khơng lặp lại khơng bỏ sót cầu hình Để đáp ứng yêu cầu phương pháp vét cạn lựa chọn thích hợp skkn II BIỆN PHÁP GIẢI QUYẾT VẤN ĐỀ Một số khái niệm 1.1 Vét cạn Phương pháp vét cạn: phương pháp tìm nghiệm toán cách xem xét tất phương án Đối với người, phương pháp khơng khả thi số phương án cần kiểm tra q lớn, nhờ có máy tính mà nhiều toán giải phương pháp *Ưu điểm: - Ln đảm bảo tìm nghiệm xác - Địi hỏi nhớ cài đặt đơn giản * Nhược điểm: Thời gian thực thi lớn, độ phức tạp thường bậc mũ 1.2 Quay lui (Backtracking) Trong nhiều trường hợp, nghiệm tốn dãy phần tử xác định khơng theo luật tính tốn định Muốn tìm nghiệm, phải thực bước theo dõi, tìm kiếm phần tử nghiệm Giá trị phần tử có nhiều khả khác Để tìm giá trị gán cho phần tử, phải thử khả xem chúng có thỏa mãn điều kiện tốn hay khơng gọi thử đúng/sai Nếu có lựa chọn chấp nhận ghi nhớ thông tin cần thiết bước thử tiếp theo.Trái lại, khơng có lựa chọn thích hợp làm lại bước trước, xố bớt ghi nhớ quay chu trình thử với lựa chọn lại Hành động gọi quay lui (Back tracking) giải thuật thể phương pháp gọi giải thuật quay lui Tìm nghiệm (gọi vét cạn) cách tiến dần, tìm kiếm khả chấp nhận cho phần tử nghiệm biết quay lui tiến Khi phần tử nghiệm gán giá trị kết thúc trình tìm nghiệm, chuyển sang tìm nghiệm Do thuật toán quay lui xây dựng sở tìm kiếm dần, kết sau hình thành từ kết trước nên sử dụng hàm thủ tục đệ quy để thực Có thể so sánh nghiệm tìm để tìm nghiệm tối ưu 1.3 Thuật tốn quay lui Mơ hình giải thuật quay lui mơ tả sau: Procedure Try (i); Begin Vòng lặp đề khả bước i Begin - Thử chọn đề cử cho bước i - Nếu đề cử thỏa mãn điều kiện skkn Begin + Lưu trạng thái toán + Xác nhận giá trị đề cử cho bước i + Xác nhận trạng thái toán sau chấp nhận đề cử + Nếu bước cuối nghiệm tăng biến đếm nghiệm Ngược lại Try(i+1) +Trả lại trạng thái trước chấp nhận đề cử End; End; End; Hoặc viết dạng sau: Procedure Try (i); Begin +Nếu bước cuối nghiệm tăng biến đếm nghiệm Ngược lại vịng lặp đề khả bước i Begin - Thử chọn đề cử cho bước i - Nếu đề cử thỏa mãn điều kiện Begin + Lưu trạng thái toán + Xác nhận giá trị đề cử cho bước i + Xác nhận trạng thái toán sau chấp nhận đề cử + Try(i+1) + Trả lại trạng thái trước chấp nhận đề cử End; End; End; Giả mã cụ thể thuật toán sau: Procedure Update; Begin count := count + 1; print(x); end; Procedure Try(i); Var j; Begin For j:=1 to m If then Begin skkn X[i]:=a[j]; ; If i=n then Update Else Try(i+1); ; End; End; Procedure Search; Begin Try(1); End; Trên thuật toán vét cạn tốn tìm cấu hình hay đếm số cấu hình Trong trường hợp tốn cần tìm cấu hình, tìm cấu hình tối ưu thuật tốn tương tự, khác phần cập nhật (Update) sinh cấu hình Chẳng hạn thủ tục Update tốn tìm nghiệm tối ưu: procedure Update; begin If then best:=x; end; Ở không xét việc áp dụng phương pháp vét cạn sử dụng đệ quy quay lui dùng cho toán đơn mà tập trung vào tốn tìm cấu hình tổ hợp, tối ưu tổ hợp Một số dạng toán liệt kê (cấu hình tổ hợp) Bài tốn tổ hợp u cầu tìm đối tượng x có dạng vector thỏa mãn điều kiện sau: x gồm k phần tử: x=(x1,x2,…,xn) Mỗi phần tử xi nhận tập đối tượng a1,a2,…,an, x thỏa mãn ràng buộc cho hàm logic G(x) Tùy trường hợp tốn u cầu tìm nghiệm, tìm tất nghiệm hay đếm số nghiệm 2.1 Tổ hợp Bài toán đặt cho xác định tất tổ hợp châp k tập n phần tử Để đơn giản ta xét tốn tìm tổ hợp tập số nguyên từ đến n Đối với tập hữu hạn bất kì, cách đánh số thứ tự phần tử, ta đưa toán tập số nguyên từ đến n Nghiệm cần tìm tốn tìm tổ hợp chập k n phần tử phải thoả mãn điều kiện sau: Là vector x =(x1,x2,…xk) skkn xi lấy giá trị tập {1,2,…n} Ràng buộc: xin then print else for j:=1 to begin x[i]:=d[j]; case j of 1: s:=s+i; 2: s:=s-i; end; try(i+1); case j of 1: s:=s-i ; 2: s:=s+i; end; end; 13 skkn end; BEGIN Init; try(2); if dem=0 then writeln(f2,'Khong bieu thuc nao thoa man'); close(f1); close(f2); END 2.3 Chỉnh hợp không lặp Nghiệm tốn tìm chỉnh hợp khơng lặp chập k tập n số nguyên từ đến n vector x thoả mãn điều kiện: x có k thành phần: x = (x1,x2,…xk) Các giá trị xi lấy tập {1,2, n} Ràng buộc: giá trị xi đôi khác nhau, tức xi¹xj với i¹j Chỉnh hợp khơng lặp yêu cầu phần tử phải khác Để đảm bảo điều đó, ngồi mảng x, ta dùng thêm cấu trúc liệu mảng d để đánh dấu Khi giá trị chọn, ta đánh dấu giá trị đó, chọn, ta chọn giá trị chưa đánh dấu Mảng d "trạng thái" thuật toán Bạn đọc xem phần giả mã để thấy rõ ý tưởng procedure Try(i); var j; begin for j := to n if d[j]=0 then begin x[i] := j; d[j] := 1; if i=k then Print(x) else Try(i+1); d[i] := 0; end; end; Ví dụ 1: Liệt kê hốn vị n số nguyên dương *Phân tích Nói cách trực quan hốn vị tập n phần tử phép thay đổi vị trí n phần tử Ví dụ với N=3 ta có tập hoán vị sau: 123, 132, 213, 231, 312, 321 * Chương trình Program Hoanvi; uses crt; const max = 20; input='HOANVI.INP'; 14 skkn output='HOANVI.OUT'; var n : integer; x,d : array[1 max] of integer; f1,f2: text; procedure readfile; begin clrscr; assign(f1,input); reset(f1); assign(f2,output); rewrite(f2); readln(f1,n); writeln(f2,'Cac hoan vi cua day ',n ,' so:'); end; procedure print; var i : integer; begin for i := to n write(f2,x[i]); writeln(f2); end; procedure try(i:integer); var j : integer; begin for j := to n if d[j] = then begin x[i] := j; d[j] := 1; if i = n then Print else try(i+1); d[j] := 0; end; end; BEGIN readfile; try(1); close(f1); close(f2); END 15 skkn Cây tìm kiếm quay lui sau: Tr y ( ) Tr y ( ) Tr y ( ) 123 Tr y ( ) Tr y ( ) Tr y ( ) Tr y ( ) Tr y ( ) 213 Tr y ( ) 132 231 Tr y ( ) 312 321 Ví dụ 2: Bài toán xếp hậu Cho bàn cờ vua nxn Hãy xếp n hậu lên bàn cờ cho không khống chế Hai hậu khống chế chúng hàng, cột đường chéo *Phân tích Để chuyển tốn dạng chuẩn tốn tìm cấu hình tổ hợp, ta có có nhận xét: hậu phải hàng cột Do ta coi hậu thứ i hàng i biết x[i] cột đặt hậu thứ i ta suy lời giải Vậy nghiệm tốn coi vector x gồm n thành phần với ý nghĩa: Con hậu thứ i đặt hàng i cột x[i] x[i] lấy giá trị tập {1,2…n} Ràng buộc: giá trị x[i] khác đôi khơng có hậu đường chéo Khác với toán sinh cấu hình đơn giản phần trước, sinh cấu hình tốn xếp hậu địi hỏi phân tích chi tiết điều kiện ràng buộc Ràng buộc thứ giá trị x[i] phải khác Ta dùng mảng đánh dấu thuật toán sinh hoán vị để đảm bảo điều Ràng buộc thứ hậu không nằm đường chéo phụ Các bạn dễ dàng nhận vị trí (x 1,y1) (x2,y2) nằm đường chéo nếu: 16 skkn x1y1=x2-y2=const Tương tự, vị trí (x1,y1) (x2,y2) nằm đường chéo phụ nếu: x1y1=x2y2=const Do đó, hậu i đặt vị trí (i,x[i]) hậu j đặt vị trí (j,x[j]) phải thỏa mãn ràng buộc: ix[i]  jx[j] i+x[i]  j+x[j] với ij Ta viết riêng hàm Ok để kiểm tra ràng buộc Nhưng giải pháp tốt dùng thêm mảng đánh dấu để mô tả đường chéo phụ có hậu khống chế Tức ta đặc hậu i vị trí (i,j), ta đánh dấu đường chéo i-j đường chéo phụ i+j Như cấu trúc liệu, ta dùng mảng: - Mảng x với ý nghĩa: x[i] cột ta đặt hậu thứ i - Mảng cot với ý nghĩa: cot[j]=true cột j có hậu đặt, ngược lại cot[j]=false - Mảng dcc với ý nghĩa: dcc[k]=true đường chéo thứ k có hậu đặt, tức ta đặt hậu vị trí (i,j) mà ij=k; ngược lại dcc[k]=false - Tương tự ta dùng mảng dcp với ý nghĩa: dcp[k]=true đường chéo phụ thứ k có hậu đặt * Chương trình Program Queens; const InputFile = 'QUEENS.INP'; OutputFile = 'QUEENS.OUT'; max = 100; var n: Integer; x: array[1 max] of Integer; cot: array[1 max] of Boolean; dcp: array[2 * max] of Boolean; dcc: array[1 - max max - 1] of Boolean; f1,f2: Text; procedure Init; begin Assign(f1, InputFile); Reset(f1); Assign(f2, OutputFile); Rewrite(f2); ReadLn(f1, n); FillChar(cot, SizeOf(cot), false); FillChar(dcp, SizeOf(dcp), false); FillChar(dcc, SizeOf(dcc), false); end; 17 skkn procedure Print; var i: Integer; begin for i := to n Write(f2, '(', i, ', ', x[i], '); '); WriteLn(f2); end; procedure Try(i: Integer); var j: Integer; begin for j := to n if not cot[j] and not dcc[i-j] and not dcp[i+j] then begin x[i] := j; cot[j]:=true; dcc[i-j]:=true; dcp[i+j]:=true; {ghi nhận trạng thái mới} if i=n then print else Try(i+1); cot[j]:=false; dcc[i-j]:=false; dcp[i+j]:=false ;{phục hồi trạng thái cũ} end; end; BEGIN Init; Try(1); Close(f1); Close(f2); END Ví dụ Tìm đường ngắn nhất: Có n thành phố, a[i,j] chi phí để di chuyển từ thành phố i đến thành phố j (Nếu khơng có đường a[i,j] = 0) Một người muốn du lịch qua tất thành phố, thành phố lần trở nơi xuất phát cho tổng chi phí nhỏ Hãy xác định đường *Phân tích Phương án tối ưu tốn vector x, xi thành phố đến thăm lần di chuyển thứ i Các điều kiện x sau: x = (x1,x2,…xn) xi lấy giá trị tập {1,2,…n} Ràng buộc: xi ¹ xj với i¹j a[xi,xi+1]>0 với i=1,2, n, coi xn+1=x1 f(x) = Trong đó: - mảng x[i]: ghi lại hành trình 18 skkn - Mảng a[i,j]: chi phí để từ thành phố i đến thành phố j - Mảng d[i]: đánh dấu thành phố thăm, d[i]=true thăm thành phố i Mỗi phương án toán người du lịch hốn vị n thành phố Vì phương án chu trình nên ta coi thành phố xuất phát thành phố * Chương trình program Travelling; const Input = 'TOUR.INP'; Output = 'TOUR.OUT'; max = 100; var A: array[1 max, max] of Integer; X, Best : array[1 max + 1] of Integer; D: array[1 max] of Boolean; m, n: Integer; Min: Integer; procedure Readfile; var i, j, k: Integer; f: Text; begin Assign(f, Input); Reset(f); ReadLn(f, n, m); for i := to n for j := to n a[i, j] := ; for k := to m begin ReadLn(f, i, j, a[i, j]); a[j, i] := a[i, j] ; end; Close(f); end; procedure Init; begin FillChar(D, n, false); d[1] := False; X[1] := 1; Min:= maxint; end; 19 skkn procedure Print; var i: Integer; f: Text; begin Assign(f, Output); Rewrite(f); for i := to n Write(f, Best[i], '->'); WriteLn(f, 1); WriteLn(f, 'Hanh trinh ngan nhat: ', Min); Close(f); end; procedure update; var s,i:integer; begin s:=a[x[n],1]; for i:=1 to n-1 s:=s+a[x[i],x[i+1]]; if sn then update else for j := to n if not d[j] and (a[x[i-1],j]>0 ) then begin X[i] := j; d[j] := true; Try(i + 1); d[j] := false; end; end; BEGIN Readfile; Init; Try(2); 20 skkn ... vét cạn phù hợp Chính nên tơi chọn đề tài: ? ?Giải dạng toán liệt kê phương pháp vét cạn sử dụng thuật toán quay lui ôn luyện học sinh giỏi môn Tin học? ?? II THỰC TRẠNG CỦA VẤN ĐỀ Thuận lợi Do quan... vững phương pháp giải tốn Bài toán tin học thường đa dạng phức tạp, tốn có nhiều phương pháp giải khác Để lựa chọn phương pháp thích hợp cho tốn, phân chia toán thành dạng toán tổng quan phương pháp. .. phương pháp giải cho dạng tốn Bài tốn liệt kê lớp tốn khó, thường xuất đề thi học sinh giỏi cấp thành phố, cấp tỉnh hay cấp quốc gia Có nhiều phương pháp giải lớp toán phương pháp vét cạn phù hợp

Ngày đăng: 19/02/2023, 15:28