Đang tải... (xem toàn văn)
Sáng tạo trong thuật toán và lập trình trong pascal và C
TỦ SÁCH TRI THỨC DUY TÂN NGUYỄN XUÂN HUY SÁNG TẠO TRONG THUẬT TỐN VÀ LẬP TRÌNH với ngơn ngữ Pascal C# Tập Tuyển toán Tin nâng cao cho học sinh sinh viên giỏi Sáng tạo Thuật tốn Lập trình Tập I MỤC LỤC Chƣơng I Bài 1.1 Lời nói đầu i GIẢI MỘT BÀI TOÁN TIN Số thân thiện Bài 1.2 Số cấp cộng Bài 1.3 Số cấp nhân 11 Bài 1.4 Mảng ngẫu nhiên 13 Bài 1.5 Chia mảng tỉ lệ 1:1 16 Bài 1.6 Chia mảng tỉ lệ 1:k 21 Chƣơng II Bài 2.1 SINH DỮ LIỆU VÀO VÀ RA Sinh ngẫu nhiên theo khoảng 27 27 Bài 2.2 Sinh ngẫu nhiên tăng 29 Bài 2.3 Sinh hoán vị ngẫu nhiên 31 Bài 2.4 Sinh ngẫu nhiên 33 Bài 2.5 Sinh ngẫu nhiên tỉ lệ 36 Bài 2.6 Sinh ngẫu nhiên tệp tăng 40 Bài 2.7 Sinh ngẫu nhiên tệp cấp số cộng 42 Bài 2.8 Sinh ngẫu nhiên mảng đối xứng 43 Bài 2.9 Số độ cao h 46 Bài 2.10 Tệp hoán vị 49 Bài 2.11 Đọc liệu từ tệp vào mảng biết hai kích thước 53 Bài 2.12 Đọc liệu từ tệp vào mảng biết kích thước 56 Bài 2.13 Đọc liệu từ tệp vào mảng đối xứng 60 Bài 2.14 Đếm tàu 62 Bài 2.15 Sắp đoạn 65 Chƣơng III Bài 3.1 BÀN PHÍM VÀ MÀN HÌNH Bảng mã ASCII 79 79 Bài 3.2 Bộ Tú lơ khơ 80 Bài 3.3 Hàm GetKey 88 Bài 3.4 Trò chơi 15 90 Bài 3.5 Bảng nhảy 95 Chƣơng IV Bài 4.1 TỔ CHỨC DỮ LIỆU Cụm 107 107 Bài 4.2 Bài gộp 112 Bài 4.3 Chuỗi hạt 120 Sáng tạo Thuật tốn Lập trình Tập I Bài 4.4 Sắp mảng ghi tệp 129 Bài 4.5 abc - theo dẫn 133 Bài 4.6 Xâu mẫu 141 Chƣơng V Bài 5.1 PHƢƠNG PHÁP THAM LAM Băng nhạc 153 153 Bài 5.2 Xếp việc 158 Bài 5.3 Xếp ba lô 165 Bài 5.4 Cây bao trùm ngắn 170 Bài 5.5 Trộn hai tệp 177 Chƣơng VI Bài 6.1 PHƢƠNG PHÁP QUAY LUI Tám Hậu 193 195 Bài 6.2 Từ chuẩn 207 Bài 6.3 Tìm đường mê cung 216 Chƣơng VII Bài 7.1 Bài Bài 7.3 Bài 7.4 QUY HOẠCH ĐỘNG Chia thưởng Palindrome Cắm hoa Tìm đường ngắn 227 228 235 243 253 Chƣơng VIII Bài 8.1 Bài 8.2 Bài 8.3 Bài 8.4 Bài 8.5 Bài 8.6 Bài 8.7 Bài 8.8 Bài 8.9 SUY NGẪM Lát Chữ số cuối khác Hình chữ nhật tối đại ma trận 0/1 Ma phương Tháp Hà Nội cổ Tháp Hà Nội xuôi Tháp Hà Nội ngược Tháp Hà Nội thẳng Tháp Hà Nội sắc màu (Hà Nội Cầu vồng) 267 267 276 281 291 308 311 316 321 325 Sáng tạo Thuật tốn Lập trình Tập I Lời nói đầu Thể theo u cầu đơng đảo bạn đọc, biên soạn lại Sáng tạo Thuật tốn Lập trình với Tốn Tin nâng cao cho học sinh sinh viên nhằm cung cấp kĩ thuật lập trình để giải tốn khó máy tính Một tốn tin hiểu khó ta sử dụng thuật giải nảy sinh đầu vừa biết nội dung tốn ta thu kết sai lời giải thu khơng hữu hiệu theo nghĩa chương trình địi hỏi q nhiều nhớ hoặc/và chạy lâu Những thuật giải nảy sinh đầu thường gọi thuật giải tự nhiên Dĩ nhiên, khái niệm tương đối Nếu bạn nắm vững nhiều dạng thuật giải thử sức với nhiều tốn khó đến lúc thuật giải tự nhiên bạn đáng tin cậy Đó mục đích học tập rèn luyện ước mơ người viết tập sách Để đọc sách khơng địi hỏi bạn phải có tri thức đặc biệt Để tiếp thu tốt đóng góp cho việc hiệu chỉnh cải tiến nội dung sách cần bạn biết sử dụng ngơn ngữ lập trình: Pascal môi trường Turbo Free Pascal C# Các kĩ thuật lập trình minh hoạ qua tốn cụ thể tương đương với trình độ nâng cao học sinh sinh viên Hình thức phát biểu tốn suy cho khơng quan trọng Các kĩ thuật lập trình phương pháp xây dựng thuật giải cho toán thường dùng rộng rãi trình thiết kế cài đặt phần mềm ứng dụng thực tiễn, việc sớm làm chủ tri thức thật cần thiết Chính mà chúng tơi cho nội dung sách phù hợp với bạn học sinh, sinh viên trường đại học bạn đọc muốn tự hoàn thiện tri thức lĩnh vực giải thuật lập trình Thiết nghĩ sách dùng làm tài liệu tham khảo để dạy lớp chuyên tin trường phổ thông Nội dung sách gồm hai phần Phần thứ giới thiệu vắn tắt chất phương pháp kĩ thuật lập trình đề toán để bạn thử sức Phần thứ hai trình bày phân tích chi tiết lời giải với bình luận xuất xứ tốn Trong tập sách cung cấp tồn văn chương trình viết ngơn ngữ lập trình Pascal C# để bạn đọc tiện so sánh với lời giải Cả hai phần đề cập đến nội dung tám chương sau Chương thứ trình bày sơ đồ chung để giải tốn tin Các tập chương hầu hết thuộc loại dễ giải Chương thứ hai giới thiệu kĩ thuật sinh liệu cách tự động nhằm phục vụ cho việc kiểm thử (test) chương trình Chương thứ ba trình bày kĩ thuật quản lí bàn phím hình Chương thứ tư đề cập đến cách thức tổ chức liệu cho toán tin Ba chương giới thiệu ba số phương pháp phổ biến thường vận dụng thiết kế thuật giải Đó phương pháp tham lam, phương pháp quay lui quy hoạch động Các phương pháp không vạn theo nghĩa dùng chúng để giải toán tin Trong thực Sáng tạo Thuật tốn Lập trình Tập I tế, phương pháp vạn khơng hữu hiệu Tuỳ theo nội dung tốn mà ta chọn phương pháp phù hợp Đó điểm khó, địi hỏi bạn đọc q trình tìm tịi tích luỹ kinh nghiệm Riêng chương cuối sách, chương thứ tám giới thiệu số toán tin để bạn đọc tự phát phương pháp giải Những nội dung tập sách tập hợp chỉnh lí từ giảng thuật tốn lập trình, từ sách Tìm đường mê cung, Bắn tàu biển từ viết tác giả đăng tạp chí Tin học nhà trường số lời giải hay bạn học sinh Lần xuất chúng tơi trình bày thêm giải viết môi trường ngôn ngữ C# để bạn sinh viên tham khảo Hi vọng dịp khác cung cấp thêm phương án giải với bạn đọc Tuy nhiên, suy cho cùng, môi trường lập trình mang tính minh hoạ Khi biết thuật tốn, việc thể thuật tốn mơi trường lập trình cụ thể chắn việc làm quen thuộc bạn đọc Xin chân thành cảm ơn em học sinh, sinh viên, thầy cô giáo, bạn bè đồng nghiệp chia sẻ kinh nghiệm trợ giúp tài liệu, nhận xét bình luận để hình thành nội dung sách Chúng hi vọng tiếp tục nhận ý kiến phê bình bạn đọc nội dung, chất lượng hình thức trình bày để định hướng cho tập Hà Nội, Lễ Hội Đạp Thanh - 2008 N.X.H Sáng tạo Thuật tốn Lập trình Tập I CHƢƠNG GIẢI MỘT BÀI TOÁN TIN Phần giới thiệu số bước thường vận dụng trình giải toán tin Bước bước quan trọng hiểu rõ nội dung toán Đây yêu cầu quen thuộc người làm toán Để hiểu toán theo cách tiếp cận tin học ta phải gắng xây dựng số thí dụ phản ánh yêu cầu đề đầu thử giải thí dụ để hình thành dần hướng thuật tốn Bước thứ hai dùng ngơn ngữ quen thuộc, tốt ngơn ngữ tốn học đặc tả đối tượng cần xử lí mức độ trừu tượng, lập tương quan, xây dựng hệ thức thể quan hệ đại lượng cần xử lí Bước thứ ba xác định cấu trúc liệu để biểu diễn đối tượng cần xử lí cho phù hợp với thao tác thuật toán Trong bước ta tiếp tục làm mịn dần đặc tả theo trình tự từ xuống, từ trừu tượng đến cụ thể, từ đại thể đến chi tiết Bước cuối sử dụng ngơn ngữ lập trình chọn để viết chương trình hồn chỉnh Ở bước ta tiến hành theo kĩ thuật từ lên, từ thao tác nhỏ đến thao tác tổ hợp Sau nhận chương trình ta cho chương trình chạy thử với liệu lấy từ thí dụ xây dựng bước Điều quan trọng xây dựng thủ tục cách khoa học có chủ đích nhằm kiểm tra tính tin cậy chương trình thu thực số cải tiến Chúng ta vận dụng cách tiếp cận để giải số toán cụ thể Những phần trình bày sử dụng vài kí pháp quen thuộc tin học, thí dụ: x = abc số tự nhiên x tạo ba chữ số a, b c a, b = hai số a b nhận giá trị từ đến Sáng tạo Thuật tốn Lập trình Tập I Sở dĩ ta khơng sử dụng kí hiệu tốn học bàn phím máy tính khơng có kí hiệu Chọn kí hiệu có sẵn ngơn ngữ lập trình giúp viết thích chương trình Bài 1.1 Số thân thiện Tìm tất số tự nhiên hai chữ số mà đảo trật tự hai chữ số thu số nguyên tố với số cho Hiểu đầu Ta kí hiệu (a, b) ước chung lớn (ucln) hai số tự nhiên a b Hai số tự nhiên a b gọi nguyên tố (a, b) = Khi đó, chẳng hạn: a (23, 32) = 1, 23 số cần tìm Theo tính chất đối xứng, ta có 32 số cần tìm b (12, 21) = 3, 12 đồng thời 21 khơng phải số cần tìm Đặc tả: Gọi hai chữ số số tự nhiên cần tìm x a b, ta có: (1) x = ab (2) a, b = (a b biến thiên khoảng 9) (3) a > x số có hai chữ số (4) (ab, ba) = Ta kí hiệu x' số đối xứng số x theo nghĩa đầu bài, ta có đặc tả sau: (5) x = 10 99 (x biến thiên từ 10 đến 99, x số có hai chữ số) (6) (x, x') = Nếu x = ab x' = ba Ta tính giá trị x' theo cơng thức: x' = (chữ số hàng đơn vị x) * 10 + (chữ số hàng chục x) Kí hiệu Đơn(x) toán tử lấy chữ số hàng đơn vị số tự nhiên x kí hiệu Chục(x) toán tử lấy chữ số hàng chục x, ta có: x' = Đơn(x)*10 + Chục(x) Tổng hợp lại ta có đặc tả: Số cần tìm x phải thoả tính chất sau:x = 10 99 (x nằm khoảng từ 10 đến 99) (7) x' = Đơn(x)*10 + Chục(x) (8) (x, x') = (ước chung lớn x x' 1) Đặc tả thể qua ngơn ngữ trình tựa Pascal sau: (9) for x:=10 to 99 if ucln(x, đơn(x)*10+Chục(x))=1 then Lấy(x); đó, ucln(a,b)là hàm cho ước chung lớn hai số tự nhiên a b; Lấy(x) tốn tử hiển thị x lên hình ghi x vào mảng với mục đích sử dụng lại, cần Ta làm mịn đặc tả (10): ucln(a, b): Thuật toán Euclid chia liên tiếp, thay số thứ dư chia cho số thứ hai hoán vị hai số (* Tim uoc chung lon nhat cua hai so a va b Thuat toan Euclid *) function Ucln(a,b: integer): integer; Sáng tạo Thuật toán Lập trình Tập I var r: integer; begin while b > begin r:= a mod b; a:= b; b:= r; end; Ucln:= a; end; Đơn(x) = (x mod 10): số dư phép chia nguyên x cho 10, thí dụ: Đơn(19) = 19 mod 10 = Chục(x) = (x div 10): thương nguyên phép chia x cho 10, thí dụ: Chục(19) = 19 div 10 = Lấy(x): write(x) nạp giá trị x vào mảng s theo thao tác sau: n := n + 1; s[n] := x; n đếm số phần tử nạp mảng s Biểu diễn liệu Ta dùng mảng s để lưu số tìm Dễ thấy s phải mảng nguyên chứa tối đa 90 phần tử số cần khảo sát nằm khoảng từ 10 đến 99 var s: array[1 90] of integer; Phương án chương trình hoạt động theo hai bước sau: n := Tim; Xem(n); Bước Tìm ghi vào mảng s số thoả điều kiện đầu bài, n số lượng số tìm Bước Hiển thị phần tử mảng s[1 n] chứa số tìm Tốn tử x' viết dạng hàm cho ta số tạo chữ số x theo trật tự ngược lại Ta đặt tên cho hàm SoDao (số đảo) Hàm nhận giá trị vào số tự nhiên có nhiều chữ số Để tạo số đảo y số x cho trước, hàm SoDao lấy dần chữ số hàng đơn vị x để ghép vào bên phải số y: y := y*10 + (x mod 10) Sau bước, chữ số hàng đơn vị lấy loại hẳn khỏi x toán tử: x := x div 10 Chỉ thị {$B-} chương trình NTCN (nguyên tố nhau) đặt chế độ kiểm tra biểu thức lôgic vừa đủ Khi xác định giá trị chân lí cần thiết khơng tiến hành tính tiếp giá trị biểu thức Thí dụ, với lệnh x := 1; y := 5; if (x > 5) and (x + y < 7)then y := y + else y := y-1; chế độ {$B-}, sau tính giá trị chân lí (x > 5) = false, chương trình bỏ qua nhân tử logic (x + y < 7), tích lôgic false với giá trị tuỳ ý cho ta false Trong trường hợp lệnh y := y - thực Ngược lại, ta đặt thị {$B+} chương trình, sau tính (x > 5) = false tiếp tục tính giá trị (x + y < 7) lấy tích hai giá trị tìm (false and true = false) làm giá trị biểu thức điều kiện cấu trúc rẽ nhánh nói Sáng tạo Thuật tốn Lập trình Tập I Cuối tốn tử y := y - thực giống trường hợp khối lượng tính tốn lại nhiều (* Pascal *) (* -So than thien (xy,yx) = *) program SoThanThien; {$B-} uses Crt; const MN = 90; var s: array[1 MN] of integer; function Ucln(a,b: integer): integer; tự viết function SoDao(x: integer): integer; var y: integer; begin y := 0; repeat { ghep chu so hang don cua x vao ben phai y } y := 10*y + (x mod 10); x := x div 10; { loai chu so hang don } until (x = 0); SoDao := y; end; (* -Tim cac so thoa dieu kien dau bai ghi vao mang s Output: so luong cac so tim duoc *) function Tim: integer; var x,d: integer; begin d := 0; {So luong cac so can tim } for x := 10 to 99 if Ucln(x,SoDao(x)) = then begin d := d + 1; s[d]:= x; end; Tim := d; end; (* -Hien thi mang s[1 n] tren man hinh *) procedure Xem(n: integer); var i: integer; begin writeln; for i := to n write(s[i]:4); writeln; end; BEGIN n := Tim; Xem(n); writeln; Sáng tạo Thuật tốn Lập trình Tập I 10 write(' Tong cong ',n,' so'); readln; END // C# using System; namespace SangTao1 { /*********************************** So Than Thien: (xy, yx) = **********************************/ class SoThanThien { static int mn = 90; static int [] s = new int[mn]; static void Main(string[] args) { Run(); Console.ReadLine(); } static void Run() { int n = Find(); for (int i=0;i b Trường hợp a = b ta khơng xét x' = x Ucln(x, x) = x 10 Nếu b = ta có x = 10a x' = a Ta thấy Ucln(10a, a) = a = a = Do ta xét riêng trường hợp Khi ab = 10 ta có (10, 1) = Vậy 10 số cần tìm số ... dựng thủ t? ?c cách khoa h? ?c có chủ đích nhằm kiểm tra tính tin c? ??y chương trình thu th? ?c số c? ??i tiến Chúng ta vận dụng c? ?ch tiếp c? ??n để giải số toán c? ?? thể Những phần trình bày sử dụng vài kí pháp... hiệu chỉnh c? ??i tiến nội dung sách c? ??n bạn biết sử dụng ngôn ngữ lập trình: Pascal mơi trường Turbo Free Pascal C# C? ?c kĩ thuật lập trình minh hoạ qua tốn c? ?? thể tương đương với trình độ nâng cao... tự động nhằm ph? ?c vụ cho vi? ?c kiểm thử (test) chương trình Chương thứ ba trình bày kĩ thuật quản lí bàn phím hình Chương thứ tư đề c? ??p đến c? ?ch th? ?c tổ ch? ?c liệu cho toán tin Ba chương giới thiệu