Sáng tạo trong Thuật toán và Lâp Trình tài liệu, giáo án, bài giảng , luận văn, luận án, đồ án, bài tập lớn về tất cả cá...
T Ủ S Á C H T R I T H Ứ C D U Y T Â N N G U Y Ễ N X U Â N H U Y S Á N G T Ạ O T R O N G T H U Ậ T T OÁ N VÀ L Ậ P T R Ì N H v ớ i n g ô n n g ữ P a s c a l v à C # T ậ p 1 T u y ể n c á c b à i t o á n T i n n â n g c a o c h o h ọ c s i n h v à s i n h v i ê n g i ỏ i Sáng tạo trong Thuật toán và Lập trình Tập I 2 M Ụ C L Ụ C Lời nói đầu i Chƣơng I GIẢI MỘT BÀI TOÁN TIN 1 Bài 1.1. Số thân thiện 2 Bài 1.2. Số cấp cộng 8 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 SINH DỮ LIỆU VÀO VÀ RA 27 Bài 2.1. Sinh ngẫu nhiên theo khoảng 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 đều 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 các hoán vị 49 Bài 2.11. Đọc dữ liệu từ tệp vào mảng biết hai kích thước 53 Bài 2.12. Đọc dữ liệu từ tệp vào mảng biết một kích thước 56 Bài 2.13. Đọc dữ 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ÀN PHÍM VÀ MÀN HÌNH 79 Bài 3.1. Bảng mã ASCII 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 TỔ CHỨC DỮ LIỆU 107 Bài 4.1. Cụm 107 Bài 4.2. Bài gộp 112 Bài 4.3. Chuỗi hạt 120 Sáng tạo trong Thuật toán và Lập trình Tập I 3 Bài 4.4. Sắp mảng rồi ghi tệp 129 Bài 4.5. abc - sắp theo chỉ dẫn 133 Bài 4.6. Xâu mẫu 141 Chƣơng V PHƢƠNG PHÁP THAM LAM 153 Bài 5.1. Băng nhạc 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 nhất 170 Bài 5.5. Trộn hai tệp 177 Chƣơng VI PHƢƠNG PHÁP QUAY LUI 193 Bài 6.1. Tám Hậu 195 Bài 6.2. Từ chuẩn 207 Bài 6.3. Tìm đường trong mê cung 216 Chƣơng VII QUY HOẠCH ĐỘNG 227 Bài 7.1. Chia thưởng 228 Bài 7. 2. Palindrome 235 Bài 7.3. Cắm hoa 243 Bài 7.4. Tìm các đường ngắn nhất 253 Chƣơng VIII SUY NGẪM 267 Bài 8.1. Lát nền 267 Bài 8.2. Chữ số cuối khác 0 276 Bài 8.3. Hình chữ nhật tối đại trong ma trận 0/1 281 Bài 8.4. Ma phương 291 Bài 8.5. Tháp Hà Nội cổ 308 Bài 8.6. Tháp Hà Nội xuôi 311 Bài 8.7. Tháp Hà Nội ngược 316 Bài 8.8. Tháp Hà Nội thẳng 321 Bài 8.9. Tháp Hà Nội sắc màu (Hà Nội Cầu vồng) 325 Sáng tạo trong Thuật toán và Lập trình Tập I 4 Lời nói đầu Thể theo yêu cầu của đông đảo bạn đọc, chúng tôi biên soạn lại cuốn Sáng tạo trong Thuật toán và Lập trình với các bài Toán Tin nâng cao cho học sinh và sinh viên nhằm cung cấp những kĩ thuật lập trình cơ bản để giải những bài toán khó trên máy tính. Một bài toán tin được hiểu là khó nếu ta sử dụng thuật giải mới nảy sinh trong đầu khi vừa biết nội dung bài toán thì hoặc là ta thu được kết quả sai hoặc là lời giải thu được sẽ không hữu hiệu theo nghĩa chương trình đòi hỏi quá nhiều bộ nhớ hoặc/và chạy quá lâu. Những thuật giải nảy sinh lập tức trong đầu như vậy thường được TỦ SÁCH TRI THỨC DUY TÂN NGUYỄN XUÂN HUY SÁNG TẠO TRONG THUẬT TOÁ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 toá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 toá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 toán Lập trình Tập I Lời nói đầu Thể theo yêu cầu đông đảo bạn đọc, biên soạn lại Sáng tạo Thuật toán Lập trình với Toá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 toán khó máy tính Một toán tin hiểu khó ta sử dụng thuật giải nảy sinh đầu vừa biết nội dung toá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 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 toá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 toá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 toá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à 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ứ toán Trong tập sách cung cấp toà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 toá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 toá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 toán mà ta chọn phương pháp phù hợp Đó điểm khó, đòi hỏi bạn đọc 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 toá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 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 ... 1 T Ủ S Á C H T R I T H Ứ C D U Y T ÂN N G U Y Ễ N X U Â N H U Y S Á N G T Ạ O T R O N G T H U Ậ T T O Á N VÀ L Ậ P T R Ì N H v ớ i n g ô n n g ữ P a s c a l v à C # T ậ p 2 T u y ể n c á c b à i t o á n T i n n â n g c a o c h o h ọ c s i n h v à s i n h v i ê n g i ỏ i 2 MỤC LỤC . Chương 1 Các bài toán về đoạn thẳng 4 Bài 1.1 Đoạn rời 1 . 4 Bài 1.2 Đoạn gối 1 8 Bài 1.3 Đoạn gối 2 .11 Bài 1.4 Đoạn gối 3 .13 Bài 1.5 Đoạn bao nhau 1 16 Bài 1.6 Đoạn bao nhau 2 19 Bài 1.7 Phủ đoạn 1 21 Bài 1.8 Xanh đỏ tím vàng 1 .24 Bài 1.9 Xanh đỏ tím vàng 2 27 Bài 1.10 Phủ đoạn 2 .30 Bài 1.11 Đoạn rời 2 34 Bài 1.12 Ghép hình chữ nhật .35 Bài 1.13 Xanh đỏ .37 Bài 1.14 Xếp đoạn .39 Bài 1.15 Các hình chữ nhật 41 Bài 1.16 Các tam giác vuông cân .46 Chương 2 Các hàm Next 52 Bài 2.1 Số sát sau cùng độ cao .52 Bài 2.2 Số sát sau cùng chữ số 54 Bài 2.3 Các hoán vị 55 Bài 2.4 Tổ hợp .58 Bài 2.5 Số Kapreka 61 Bài 2.6 Khóa vòng 66 Bài 2.7 Trả tiền .69 Bài 2.8 Dãy Farey 72 Bài 2.9 Qúy Mùi .77 Bài 2.10 Tổng đoạn .79 Bài 2.11 Đoạn không giảm dài nhất 82 Bài 2.12 Đoạn đơn điệu dài nhất 84 Bài 2.13 Lũy thừa 2, 3 và 5 87 Chương 3 Trò chơi .89 Bài 3.1. Bốc sỏi A 90 Bài 3.2. Bốc sỏi B 92 Bài 3.3. Bốc sỏi C 94 Bài 3.4. Chia đoạn 97 Bài 3.5. Bốc sỏi D 97 Bài 3.6. Bốc sỏi E .99 Bài 3.7. Bốc sỏi F .100 Bài 3.8. Chia Hình chữ nhật .102 Bài 3.9. Bốc sỏi G 103 Bài 3.10. Chia Hình hộp .103 3 Bài 3.11. Trò Sáng tạo trong Thuật toán và Lập trình Tập I 4 Lời nói đầu Thể theo yêu cầu của đông đảo bạn đọc, chúng tôi biên soạn lại cuốn Sáng tạo trong Thuật toán và Lập trình với các bài Toán Tin nâng cao cho học sinh và sinh viên nhằm cung cấp những kĩ thuật lập trình cơ bản để giải những bài toán khó trên máy tính. Một bài toán tin được hiểu là khó nếu ta sử dụng thuật giải mới nảy sinh trong đầu khi vừa biết nội dung bài toán thì hoặc là ta thu được kết quả sai hoặc là lời giải thu được sẽ không hữu hiệu theo nghĩa chương trình đòi hỏi quá nhiều bộ nhớ hoặc/và chạy quá lâu. Những thuật giải nảy sinh lập tức trong đầu như vậy thường được gọi là thuật giải tự nhiên. Dĩ nhiên, khái niệm này chỉ là tương đối. Nếu bạn đã nắm vững nhiều dạng thuật giải và đã từng thử sức với nhiều bài toán khó thì đến một lúc nào đó các thuật giải tự nhiên của bạn sẽ đáng tin cậy. Đó cũng chính là mục đích của sự học tập và rèn luyện và cũng là ước mơ của người viết tập sách này. Để đọc sách không đòi hỏi bạn phải có tri thức gì đặc biệt. Để tiếp thu tốt và đóng góp cho việc hiệu chỉnh và cải tiến nội dung cuốn sách chỉ cần bạn biết sử dụng một trong các ngôn ngữ lập trình: Pascal trong môi trường Turbo hoặc Free Pascal hoặc C#. Các kĩ thuật lập trình được minh hoạ qua những bài toán cụ thể tương đương với trình độ nâng cao của học sinh và sinh viên. Hình thức phát biểu bài toán suy cho cùng là không quan trọng. Các kĩ thuật lập trình và phương pháp xây dựng thuật giải cho những bài toán thường được dùng rộng rãi trong quá trình thiết kế và cài đặt các phần mềm ứng dụng trong thực tiễn, cho nên việc sớm làm chủ các tri thức này mới thật sự là cần thiết. Chính vì vậy mà chúng tôi cho rằng nội dung cuốn sách có thể phù hợp với các bạn học sinh, sinh viên các trường đại học và những bạn đọc muốn tự hoàn thiện tri thức trong lĩnh vực giải thuật và lập trình. Thiết nghĩ cuốn sách cũng có thể được dùng làm tài liệu tham khảo để dạy ở các lớp chuyên tin của các trường phổ thông. Nội dung sách gồm hai phần. Phần thứ nhất giới thiệu vắn tắt về bản chất các phương pháp và kĩ thuật lập trình và các đề toán để các bạn thử sức. Phần thứ hai trình bày và phân tích chi tiết lời giải cùng với những bình luận và xuất xứ của các bài toán. Trong tập sách này cũng cung cấp toàn văn các chương trình viết bằng ngôn ngữ lập trình Pascal và C# để bạn đọc tiện so sánh với lời giải của mình. Cả hai phần đều đề cập đến nội dung của tám chương như sau. Chương thứ nhất trình bày sơ đồ chung để giải một bài toán tin. Các bài tập ở chương này hầu hết thuộc loại dễ giải. Chương thứ hai giới thiệu các kĩ thuật sinh dữ liệu một cách tự động T Ủ S Á C H T R I T H Ứ C D U Y T Â N N G U Y Ễ N X U Â N H U Y S Á N G T Ạ O T R O N G T H U Ậ T T OÁ N VÀ L Ậ P T R Ì N H v ớ i n g ô n n g ữ P a s c a l v à C # T ậ p 1 T u y ể n c á c b à i t o á n T i n n â n g c a o c h o h ọ c s i n h v à s i n h v i ê n g i ỏ i Sáng tạo trong Thuật toán và Lập trình Tập I 2 M Ụ C L Ụ C Lời nói đầu i Chƣơng I GIẢI MỘT BÀI TOÁN TIN 1 Bài 1.1. Số thân thiện 2 Bài 1.2. Số cấp cộng 8 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 SINH DỮ LIỆU VÀO VÀ RA 27 Bài 2.1. Sinh ngẫu nhiên theo khoảng 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 đều 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 các hoán vị 49 Bài 2.11. Đọc dữ liệu từ tệp vào mảng biết hai kích thước 53 Bài 2.12. Đọc dữ liệu từ tệp vào mảng biết một kích thước 56 Bài 2.13. Đọc dữ 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ÀN PHÍM VÀ MÀN HÌNH 79 Bài 3.1. Bảng mã ASCII 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 TỔ CHỨC DỮ LIỆU 107 Bài 4.1. Cụm 107 Bài 4.2. Bài gộp 112 Bài 4.3. Chuỗi hạt 120 Sáng tạo trong Thuật toán và Lập trình Tập I 3 Bài 4.4. Sắp mảng rồi ghi tệp 129 Bài 4.5. abc - sắp theo chỉ dẫn 133 Bài 4.6. Xâu mẫu 141 Chƣơng V PHƢƠNG PHÁP THAM LAM 153 Bài 5.1. Băng nhạc 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 nhất 170 Bài 5.5. Trộn hai tệp 177 Chƣơng VI PHƢƠNG PHÁP QUAY LUI 193 Bài 6.1. Tám Hậu 195 Bài 6.2. Từ chuẩn 207 Bài 6.3. Tìm đường trong mê cung 216 Chƣơng VII QUY HOẠCH ĐỘNG 227 Bài 7.1. Chia thưởng 228 Bài 7. 2. Palindrome 235 Bài 7.3. Cắm hoa 243 Bài 7.4. Tìm các đường ngắn nhất 253 Chƣơng VIII SUY NGẪM 267 Bài 8.1. Lát nền 267 Bài 8.2. Chữ số cuối khác 0 276 Bài 8.3. Hình chữ nhật tối đại trong ma trận 0/1 281 Bài 8.4. Ma phương 291 Bài 8.5. Tháp Hà Nội cổ 308 Bài 8.6. Tháp Hà Nội xuôi 311 Bài 8.7. Tháp Hà Nội ngược 316 Bài 8.8. Tháp Hà Nội thẳng 321 Bài 8.9. Tháp Hà Nội sắc màu (Hà Nội Cầu vồng) 325 Sáng tạo trong Thuật toán và Lập trình Tập I 4 Lời nói đầu Thể theo yêu cầu của đông đảo bạn đọc, chúng tôi biên soạn lại cuốn Sáng tạo trong Thuật toán và Lập trình với các bài Toán Tin nâng cao cho học sinh và sinh viên nhằm cung cấp những kĩ thuật lập trình cơ bản để giải những bài toán khó trên máy tính. Một bài toán tin được hiểu là khó nếu ta sử dụng thuật giải mới nảy sinh trong đầu khi vừa biết nội dung bài toán thì hoặc là ta thu được kết quả sai hoặc là lời giải thu được sẽ không hữu hiệu theo nghĩa chương trình đòi hỏi quá nhiều bộ nhớ hoặc/và chạy quá lâu. Những thuật giải nảy sinh lập tức trong đầu như vậy thường được gọi là thuật giải tự nhiên. Dĩ nhiên, khái niệm này chỉ là tương đối. Nếu bạn đã nắm vững nhiều dạng thuật giải và đã từng thử sức với nhiều bài toán khó thì đến một lúc nào đó các thuật giải tự nhiên của bạn sẽ đáng tin cậy. Đó cũng chính là mục đích của sự học tập và rèn luyện và cũng là ước mơ của người viết tập sách này. Để đọc sách không đòi hỏi bạn phải có T Ủ S Á C H T R I T H Ứ C D U Y T Â N N G U Y Ễ N X U Â N H U Y S Á N G T Ạ O T R O N G T H U Ậ T T OÁ N VÀ L Ậ P T R Ì N H v ớ i n g ô n n g ữ P a s c a l v à C # T ậ p 1 T u y ể n c á c b à i t o á n T i n n â n g c a o c h o h ọ c s i n h v à s i n h v i ê n g i ỏ i Sáng tạo trong Thuật toán và Lập trình Tập I 2 M Ụ C L Ụ C Lời nói đầu i Chƣơng I GIẢI MỘT BÀI TOÁN TIN 1 Bài 1.1. Số thân thiện 2 Bài 1.2. Số cấp cộng 8 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 SINH DỮ LIỆU VÀO VÀ RA 27 Bài 2.1. Sinh ngẫu nhiên theo khoảng 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 đều 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 các hoán vị 49 Bài 2.11. Đọc dữ liệu từ tệp vào mảng biết hai kích thước 53 Bài 2.12. Đọc dữ liệu từ tệp vào mảng biết một kích thước 56 Bài 2.13. Đọc dữ 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ÀN PHÍM VÀ MÀN HÌNH 79 Bài 3.1. Bảng mã ASCII 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 TỔ CHỨC DỮ LIỆU 107 Bài 4.1. Cụm 107 Bài 4.2. Bài gộp 112 Bài 4.3. Chuỗi hạt 120 Sáng tạo trong Thuật toán và Lập trình Tập I 3 Bài 4.4. Sắp mảng rồi ghi tệp 129 Bài 4.5. abc - sắp theo chỉ dẫn 133 Bài 4.6. Xâu mẫu 141 Chƣơng V PHƢƠNG PHÁP THAM LAM 153 Bài 5.1. Băng nhạc 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 nhất 170 Bài 5.5. Trộn hai tệp 177 Chƣơng VI PHƢƠNG PHÁP QUAY LUI 193 Bài 6.1. Tám Hậu 195 Bài 6.2. Từ chuẩn 207 Bài 6.3. Tìm đường trong mê cung 216 Chƣơng VII QUY HOẠCH ĐỘNG 227 Bài 7.1. Chia thưởng 228 Bài 7. 2. Palindrome 235 Bài 7.3. Cắm hoa 243 Bài 7.4. Tìm các đường ngắn nhất 253 Chƣơng VIII SUY NGẪM 267 Bài 8.1. Lát nền 267 Bài 8.2. Chữ số cuối khác 0 276 Bài 8.3. Hình chữ nhật tối đại trong ma trận 0/1 281 Bài 8.4. Ma phương 291 Bài 8.5. Tháp Hà Nội cổ 308 Bài 8.6. Tháp Hà Nội xuôi 311 Bài 8.7. Tháp Hà Nội ngược 316 Bài 8.8. Tháp Hà Nội thẳng 321 Bài 8.9. Tháp Hà Nội sắc màu (Hà Nội Cầu vồng) 325 Sáng tạo trong Thuật toán và Lập trình Tập I 4 Lời nói đầu Thể theo yêu cầu của đông đảo bạn đọc, chúng tôi biên soạn lại cuốn Sáng tạo trong Thuật toán và Lập trình với các bài Toán Tin nâng cao cho học sinh và sinh viên nhằm cung cấp những kĩ thuật lập trình cơ bản để giải những bài toán khó trên máy tính. Một bài toán tin được hiểu là khó nếu ta sử dụng thuật giải mới nảy sinh trong đầu khi vừa biết nội dung bài toán thì hoặc là ta thu được kết quả sai hoặc là lời giải thu được sẽ không hữu hiệu theo nghĩa chương trình đòi hỏi quá nhiều bộ nhớ hoặc/và chạy quá lâu. Những thuật giải nảy sinh lập tức trong đầu như vậy thường được gọi là thuật giải tự nhiên. Dĩ nhiên, khái niệm này chỉ là tương đối. Nếu bạn đã nắm vững nhiều dạng thuật giải và đã từng thử sức với nhiều bài toán khó thì đến một lúc nào đó các thuật giải tự nhiên của bạn sẽ đáng tin cậy. Đó cũng chính là mục đích của sự học tập và rèn luyện và cũng là ước mơ của người viết tập sách này. Để đọc sách không đòi hỏi bạn phải có tri thức gì đặc biệt. Để tiếp thu tốt và đóng góp cho việc hiệu chỉnh và cải tiến nội dung cuốn sách chỉ cần bạn biết sử dụng một trong các ngôn ngữ lập trình: Pascal trong môi trường Turbo hoặc Free Pascal hoặc C#. Các kĩ thuật lập trình được minh hoạ qua những bài toán cụ thể tương đương với trình độ nâng cao của ... 325 Sáng tạo Thuật toán Lập trình Tập I Lời nói đầu Thể theo yêu cầu đông đảo bạn đọc, biên soạn lại Sáng tạo Thuật toán Lập trình với Toán Tin nâng cao cho học sinh sinh viên nhằm cung cấp kĩ thuật. .. để giải toán tin Trong thực Sáng tạo Thuật toá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 toán mà ta chọn phương pháp phù hợp Đó điểm khó, đòi hỏi bạn đọc trình tìm... 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 toá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