Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 27 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
27
Dung lượng
0,95 MB
Nội dung
ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC SƯ PHẠM KHOA TIN - - PHẠM THỊ THANH HIỀN NGHIÊN CỨU PHƯƠNG PHÁP QUAY LUI VÀ ỨNG DỤNG GIẢI BÀI TỐN SUDOKU KHĨA LUẬN TỐT NGHIỆP Mục lục MỞ ĐẦU I LÝ DO CHỌN ĐỀ TÀI: II MỤC TIÊU, NHIỆM VỤ: III PHƯƠNG PHÁP NGHIÊN CỨU: IV BỐ CỤC CỦA ĐỀ TÀI: Chương I: CƠ SỞ LÝ THUYẾT I CƠ SỞ LÝ THUYẾT: Mảng: 1.1 Mơ hình quan niệm: 1.2 Các đặc trưng bản: .3 1.3 Cấu trúc lưu trữ: 1.4 Các phép toán bản: .3 Hàm đệ quy: 2.1 Đệ quy gì? .4 2.2 Cấu trúc chương trình đệ quy: 2.3 Đặc điểm: 2.4 Ví dụ: Khử đệ quy: .6 3.1 Khái niệm: .7 3.2 Cách thực : .7 II NGƠN NGỮ LẬP TRÌNH: .7 Vài nét Visual C#: .7 Đặc điểm ngôn ngữ C#: Chương II: PHƯƠNG PHÁP QUAY LUI .10 I KHÁI NIỆM QUAY LUI: 10 * Tư tưởng thuật toán: 11 II MƠ HÌNH CỦA BÀI TỐN: 11 III ỨNG DỤNG: 12 Phương pháp : .12 Giải thuật tổng quát : 13 Chương III: BÀI TOÁN SUDOKU 15 I GIỚI THIỆU BÀI TOÁN: 15 Lịch sử đời: .15 Luật chơi: .16 Các biến thể: 17 II XÂY DỰNG CẤU TRÚC DỮ LIỆU CHO BÀI TOÁN: 18 III THUẬT TOÁN: 23 Tổng quan: .23 1.1 Xác định toán: 23 1.1.1 Thông tin vào: 23 1.1.2 Thông tin ra: 23 1.2 Cách xác định ô số bất kỳ: .23 1.2.1 Xác định ô theo số thứ tự từ đến 81: 23 1.2.2 Xác định [hàng, cột]: .24 1.2.3 Xác định [vùng, số thứ tự vùng]: .24 Vấn đề đặt ra: 25 Giải vấn đề: 26 3.1 Vấn đề 1: 26 3.2 Vấn đề 2: 30 Giải thuật chính: 31 Các phương thức sử dụng chương trình: 32 Xây dựng hàm: 33 6.1 Hàm kiểm tra cột: 33 6.2 Hàm kiểm tra hàng: .34 6.3 Hàm kiểm tra vùng: .35 6.4 Hàm giải chương trình thủ cơng: 36 6.5 Hàm giải chương trình phương pháp quay lui: .36 6.6 Hàm giải đến đáp án cần chọn: 38 6.7 Hàm đếm số đáp án: 38 IV GIỚI THIỆU CHƯƠNG TRÌNH GIẢI: 38 Tổng quan: .38 Chức chính: 43 Bảng phím tắt: .44 V THỬ NGHIỆM: .45 KẾT LUẬN 48 TÀI LIỆU THAM KHẢO 49 MỞ ĐẦU I LÝ DO CHỌN ĐỀ TÀI: Ngày với phát triển không ngừng khoa học kỹ thuật, đặc biệt ngành mũi nhọn như: Điện Tử - Tin Học - Viễn Thông v.v Nếu không thường xun cập nhật thơng tin khơng bắt kịp đà phát triển giới Đất nước ngày tiến bộ, khoa học kĩ thuật ngày phát triển địi hỏi người ngày phải có lực thật sự, phải có khả tư logic tốt để tiếp cận với công nghệ đại cách nhanh chóng Vấn đề đặt để phát triển khả tư người, đơi chúng khơng nhận trị chơi trí tuệ, trị chơi với số giúp rèn luyện trí não, tư logic Và SuDoKu trị chơi trí tuệ tiếng, trị chơi khơng ồn âm thầm phát triển khơng đơn trị chơi mà giúp kích thích tư duy, suy nghĩ logic thông qua số Ngoài vấn đề trên, SuDoKu hấp dẫn giới trẻ lý chơi lúc nơi, chơi xe buýt, chơi, chí dã ngoại, du lịch Luật chơi SuDoKu đơn giản, đáp án lại khó giải, khơng cần dùng đến kiến thức số học hay tính tốn, SuDoKu thích ứng cho người, trẻ em có hội giải SuDoKu thành cơng người lớn Trong thuật tốn quay lui thuật tốn điển hình để giải lớp toán liệt kê hay toán tối ưu như: toán người giao hàng, toán mã tuần, tốn hậu, tốn tìm đường mê cung Bằng việc liệt kê tình huống, thử khả tìm thấy lời giải đúng, thuật tốn quay lui chia nhỏ toán, lời giải toán lớn kết việc tìm kiếm theo chiều sâu tập hợp toán phần tử -1- Nhận thấy tư tưởng thuật toán phù hợp với cách giải trò chơi, nên đề tài ”Nghiên cứu phương pháp quay lui ứng dụng giải tốn SuDoku” thực nhằm tìm hiểu thuật tốn quay lui ứng dụng II MỤC TIÊU, NHIỆM VỤ: Đề tài thực nhằm đạt mục tiêu hiểu rõ, hiểu sâu sắc thuật tốn quay lui Xây dựng thành cơng chương trình giải SuDoKu với nhiều đáp án với thời gian nhanh III PHƯƠNG PHÁP NGHIÊN CỨU: - Tìm hiểu thơng tin mạng internet, sách, báo, tạp chí… - Thu thập ý kiến chuyên gia (giáo viên hướng dẫn, giáo viên khoa, ý kiến bạn bè,…) - Kết hợp nghiên cứu lý thuyết với thực hành, rèn luyện kỹ phân tích chương trình kỹ lập trình IV BỐ CỤC CỦA ĐỀ TÀI: Nội dung đề tài trình bày sau: MỞ ĐẦU Chương I: CƠ SỞ LÝ THUYẾT Chương II: PHƯƠNG PHÁP QUAY LUI Chương III: BÀI TOÁN SUDOKU KẾT LUẬN TÀI LIỆU THAM KHẢO -2- CƠ SỞ LÝ THUYẾT Chương I: I CƠ SỞ LÝ THUYẾT: Mảng: 1.1 Mơ hình quan niệm: Mảng dãy có thứ tự (về mặt vị trí) phần tử với hai đặc điểm sau : + Số lượng phần tử cố định + Mọi phần tử có kiểu liệu (dữ liệu sở mảng) 1.2 Các đặc trưng bản: - Cho phép truy cập ngẫu nhiên đến phần tử Thời gian truy cập đến phần tử - Số lượng phần tử mảng cố định 1.3 Cấu trúc lưu trữ: - Cấu trúc lưu trữ đơn giản dùng địa tính để thực lưu trữ tìm kiếm phần tử, mảng chiều hay vectơ - Các phần tử bố trí sát nhớ theo thứ tự tăng dần số nên dễ dàng tìm địa phần tử biết số a1 a2 … … an 1.4 Các phép tốn bản: - Thường có phép tạo lập (create) mảng, tìm kiếm (retrieve) phần tử mảng, cập nhật (update) phần tử mảng …Ngoài giá trị, phần tử mảng đặc trưng số (index) thể thứ tự phần tử mảng Vectơ mảng chiều, phần tử ứng với số i Ma trận mảng hai chiều, phần tử aij ứng với hai số i j Tương tự người ta mở rộng mảng hai chiều , mảng ba chiều, …, mảng n chiều -3- Hàm đệ quy: 2.1 Đệ quy gì? Ta nói: - Một đối tượng đệ quy bao gồm phận định nghĩa dạng - Một thủ tục gọi đệ quy q trình thực phải gọi đến với kích thước nhỏ tham số - Trong thân hàm, gọi tới hàm để xử lý tốn gọi hàm đệ quy Ví dụ: 1) Định nghĩa số tự nhiên: - số tự nhiên - n số tự nhiên n-1 số tự nhiên 2) Định nghĩa hàm giai thừa: - 0! = - Nếu n > n! = n(n-1)! 2.2 Cấu trúc chương trình đệ quy: Một chương trình đệ quy gồm phần: - Phần sở : Trong đó, chứa tác động hàm thủ tục với số giá trị cụ thể ban đầu tham số (hay gọi trường hợp dừng) Ví dụ : if n=1 then gt:=1; - Phần đệ quy: Trong đó, tác động cần thực cho giá trị thời tham số định nghĩa tác động định nghĩa trước với kích thước nhỏ tham số Ví dụ: if n>1 then gt:=n*gt(n-1); -4- 2.3 Đặc điểm: - Mỗi lần hàm tự gọi đệ quy đến máy tính tự tạo biến cục - Có lần hàm gọi đệ quy có nhiêu lần thoát khỏi hàm (kiểu lặp hàm) - Khi ngồi hàm đệ quy loạt biến cục tạo dùng đệ quy lúc giải phóng, chúng giải phóng trước biến cục (sinh đệ quy) tạo sau - Sử dụng đệ quy phương pháp làm cho chương trình ngắn gọn, dễ hiểu làm tốn nhớ thời gian 2.4 Ví dụ: Hàm tính giai thừa n (tính n!): Function giaithua(n:word):integer; begin if n=0 then giaithua:=1 else giaithua:=giaithua(n-1)*n; end; Ví dụ: Tính n! =3 Ta có giá trị truyền vào hàm gt qua biến n Trong ví dụ này, qui trình thực sau: - Khi có lệnh gọi hàm, chẳng hạn: n := gt(3); - Thì máy ghi nhớ là: gt(3) := * gt(2); tính gt(2) - Kế tiếp máy lại ghi nhớ: gt(2) := * gt(1); tính gt(1) - Theo định nghĩa hàm thì: -5- gt(1) := 1; - Máy quay ngược lại: gt(2) := * 1; cho kết - Tiếp tục: - gt(3) := * 2; cho kết - Như kết cuối trả Ta có: 3! = Nhận xét Ưu điểm: - Điểm mạnh lớn nhất: chương trình, code trở nên ngắn gọn, dễ hiểu, thuận lợi cho việc chỉnh sửa - Dễ chuyển thành chương trình ngơn ngữ lập trình Nhược điểm: - Nhược điểm lớn tốn nhớ - Mất nhiều thời gian xử lý, làm giảm tốc độ chạy chương trình - Khơng áp dụng cho ngơn ngữ lập trình Đệ quy khơng phương pháp lập trình quan trọng mà cịn phương pháp suy nghĩ để giải vấn đề cách tổng quát dựa ý tưởng: + Đơn giản hố cơng việc + Phân vùng để xử lý Khử đệ quy: Đệ quy tim nghiên cứu lý thuyết thực hành tính tốn, thể nhiều sức mạnh có ưu điểm nhiều tốn Nhưng có đơi khi, hạn hẹp nhớ dành cho chương trình khơng cho phép làm điều đó.Vì vấn đề khử đệ quy lại cần quan tâm, xem xét -6- - C++ cho phép đa thừa kế (multiple interitances) sử dụng cách, thực điểm mạnh Tuy nhiên, đa thừa kế khó quản lý khó áp dụng Đây lý C# phát triển thừa kế đơn (single inheritance) - Namespaces C#: Khái niệm Namespaces hiểu cách đơn giản tập lớp có mối liên hệ lẫn Ví dụ ta gom lớp có liên quan đến hoạt động sở liệu lại đặt cho chúng không gian tên (namespace) chung gọi DataActivity Vì C# khơng cho phép có hai lớp tên chương trình, việc dùng namespace giúp ta tránh đụng độ vấn đề đặt tên Sẽ hồn tồn xảy đụng độ có nhiều lớp khai báo chương trình, chẳng hạn lớp Connection DataActivity xung đột với lớp Connection InternetActivity Để tránh đụng độ này, C# quy định tên lớp phải bao gồm namespace lớp Vì tên thích hợp lớp Connection trường hợp DataActivity Connection InternetActivity.Connection Điểm bật C# Namespace không ánh xạ cách vật lý Java Các lớp với namespace nhiều thư mục khác Và namespace bao gồm lớp, kiện, exception chí namespace khác -9- PHƯƠNG PHÁP QUAY LUI Chương II: I KHÁI NIỆM QUAY LUI: Kĩ thuật quay lui (backtracking) tên gọi nó, q trình phân tích xuống quay lui trở lại theo đường qua Bằng việc liệt kê tình huống, thử khả có tìm thấy lời giải đúng, thuật toán quay lui chia nhỏ toán, lời giải toán lớn kết việc tìm kiếm theo chiều sâu tốn phần tử Trong suốt q trình tìm kiếm gặp phải hướng mà biết khơng thể tìm thấy đáp án quay lại bước trước tìm hướng khác hướng vừa tìm Trong trường hợp khơng cịn hướng khác thuật tốn kết thúc Thuật tốn quay lui thể theo sơ đồ tìm kiếm theo chiều sâu hình dưới: Gốc X1 Khả x X2 Khả x với x chọn X3 Khả x với x x chọn X4 Khả x với x , x x chọn Một đáp án - 10 - Từ hình vẽ, dẽ dàng nhận thấy: - Ở toán (mỗi nốt), ta tìm lời giải cho tốn Ứng với lời giải, ta giải toán toán gốc trở nên đầy đủ - Lời giải toán gốc thường lối từ gốc đến nốt cuối (khơng có nốt con) * Tư tưởng thuật toán: - Nét đặc trưng kĩ thuật quay lui bước hướng tới lời giải cuối tốn hồn tồn làm thử - Tại bước, có lựa chọn chấp nhận ghi nhận lại lựa chọn tiến hành bước thử Cịn ngược lại khơng có lựa chọn thích hợp làm lại bước trước, xóa bỏ ghi nhận quay chu trình thử lựa chọn lại - Điểm quan trọng thuật toán phải ghi nhớ bước qua để tránh trùng lặp quay lui Các thông tin cần lưu trữ vào ngăn xếp-Stack (vào sau trước), nên thuật toán thể ý thiết kế cách đệ quy - Thuật toán quay lui thường cài đặt theo lối đệ quy, lần gọi hàm đệ quy, hàm đệ quy truyền tham số (trong tham số) số toán con, hàm cố gắng tìm lời giải cho tốn đó, tìm thấy gọi hàm đệ quy để giải tốn đưa đáp án tốn lớn đầy đủ lời giải, khơng tìm thấy chương trình trở điểm gọi hàm Mục đích việc sử dụng hàm đệ quy để thuật toán rỏ ràng, dễ viết, dễ hiểu để bảo toàn biến, trạng thái lúc giải tốn II MƠ HÌNH CỦA BÀI TỐN: Lời giải tốn thường biểu diễn véc tơ gồm n thành phần phải thỏa mãn điều kiện Để lời giải x, ta phải xây dựng dần thành phần lời giải x=(x1,x2, xn) - 11 - Tại bước i: - Đã xây dựng xong thành phần x=(x1,x2, xn) - Xây dựng thành phần xi cách thử tất khả mà xi chọn: + Nếu khả j phù hợp cho xi xác định xi theo khả j Thường phải có thêm thao tác ghi nhận trạng thái toán để hỗ trợ cho bước quay lui Nếu i = n ta có lời giải, ngược lại tiến hành bước i+1 để xác định xi+1 + Nếu khơng có khả chấp nhận cho xi ta lùi lại bước trước (bước i-1) để xác định lại thành phần xi-1 III ỨNG DỤNG: Sử dụng thuật toán quay lui dùng để giải toán liệt kê cấu hình Mỗi cấu hình xây dựng cách xây dựng phần tử, phần tử chọn cách thử tất khả Phương pháp : Giả thiết cấu hình cần liệt kê có dạng (x1 x2 xn) Khi thuật toán quay lui thực qua bước sau : Bước 1: Xét tất giá trị x1 nhận, thử cho x1 nhận giá trị Với giá trị thử cho x1 ta làm tiếp Bước Bước 2: Xét tất giá trị x2 nhận, lại thử cho x2 nhận giá trị Với giá trị thử gán cho x2 lại xét tiếp khả chọn x3 tiếp tục đến bước n Bước n: Xét tất giá trị xn nhận, thử cho xn nhận giá trị đó, thơng báo cấu hình tìm (x1 x2 xn) - 12 - Giải thuật tổng quát : Thuật toán quay lui mơ tả đoạn mã sau (thủ tục thử cho xi nhận giá trị mà nhận) : void Try (int i) { for { if else { Try(i+1); // gọi đệ quy chọn tiếp x[i+1] } } } (Thuật toán quay lui bắt đầu lời gọi Try(1)) + Đầu tiên, Try(int i) hàm đệ quy quay lui i biến chạy từ n tương ứng với số thứ tự x1, x2, x3, … , xn theo phương pháp đệ quy + Tiếp theo vòng lặp for cho giá trị phần tử x1, x2, x3,… Tất nhiên, tốn riêng giá trị khác - 13 - + Trạng thái cuối tức điểm dừng thuật toán Thực chất thuật toán quay lui đệ quy nên việc xác định điểm dừng quan trọng ln ln phải có + Tiếp theo phần xuất ra, thấy, if (phần tử cuối cấu hình) xuất hình khơng chạy hàm đệ quy Tuy nhiên, xuất lại xuất tới nhiều dãy số (tùy tập) Lý do, để ý thấy phía có vịng for, hoạt động giống kiểu nhiều vòng lặp for lồng for(i =1; i