1. Trang chủ
  2. » Luận Văn - Báo Cáo

(Luận văn) nghiên cứu phương pháp quay lui và ứng dụng giải bài toán sudoku

53 2 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

Thông tin cơ bản

Tiêu đề Nghiên cứu phương pháp quay lui và ứng dụng giải bài toán Sudoku
Tác giả Phạm Thị Thanh Hiền
Trường học Trường Đại Học Sư Phạm Đà Nẵng
Chuyên ngành Lập trình và Giải thuật
Thể loại Luận văn tốt nghiệp
Thành phố Đà Nẵng
Định dạng
Số trang 53
Dung lượng 1,31 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Cấu trúc

  • III. PHƯƠNG PHÁP NGHIÊN CỨU (6)
  • IV. BỐ CỤC CỦA ĐỀ TÀI (6)
  • Chương I: CƠ SỞ LÝ THUYẾT (0)
    • I. CƠ SỞ LÝ THUYẾT (7)
      • 1. Mảng (7)
        • 1.1. Mô hình quan niệm (7)
        • 1.2. Các đặc trưng cơ bản (7)
        • 1.3. Cấu trúc lưu trữ (7)
        • 1.4. Các phép toán cơ bản (7)
      • 2. Hàm đệ quy (8)
        • 2.1. Đệ quy là gì? (8)
        • 2.2. Cấu trúc chính của một chương trình đệ quy (8)
        • 2.3. Đặc điểm (9)
        • 2.4. Ví dụ (9)
      • 3. Khử đệ quy (10)
        • 3.1. Khái niệm (11)
        • 3.2. Cách thực hiện (11)
    • II. NGÔN NGỮ LẬP TRÌNH (11)
      • 1. Vài nét về Visual C# (11)
      • 2. Đặc điểm của ngôn ngữ C# (12)
  • Chương II: PHƯƠNG PHÁP QUAY LUI (0)
  • Chương III: BÀI TOÁN SUDOKU (0)
    • I. GIỚI THIỆU BÀI TOÁN (19)
      • 1. Lịch sử ra đời (19)
      • 2. Luật chơi (20)
      • 3. Các biến thể (21)
    • II. XÂY DỰNG CẤU TRÚC DỮ LIỆU CHO BÀI TOÁN (22)
    • III. THUẬT TOÁN (27)
      • 1. Tổng quan (27)
        • 1.1. Xác định bài toán (27)
          • 1.1.1. Thông tin vào (27)
          • 1.1.2. Thông tin ra (27)
        • 1.2. Cách xác định mỗi ô số bất kỳ (27)
          • 1.2.1. Xác định các ô theo số thứ tự từ 1 đến 81 (27)
          • 1.2.2. Xác định bằng [hàng, cột] (28)
          • 1.2.3. Xác định bằng [vùng, số thứ tự trong vùng] (28)
      • 2. Vấn đề đặt ra (29)
      • 3. Giải quyết vấn đề (30)
        • 3.1. Vấn đề 1 (0)
        • 3.2. Vấn đề 2 (34)
      • 4. Giải thuật chính (35)
      • 5. Các phương thức sử dụng trong chương trình (36)
        • 6.6. Hàm giải đến đáp án cần chọn (42)
        • 6.7. Hàm đếm số đáp án (42)
    • IV. GIỚI THIỆU CHƯƠNG TRÌNH GIẢI (0)
      • 2. Chức năng chính (47)
      • 3. Bảng phím tắt (48)
    • V. THỬ NGHIỆM (49)
  • KẾT LUẬN (6)
  • TÀI LIỆU THAM KHẢO (6)

Nội dung

PHƯƠNG PHÁP NGHIÊN CỨU

- Tìm hiểu thông tin trên 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, các giáo viên trong và ngoài khoa, ý kiến của 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ỹ năng phân tích chương trình và kỹ năng lập trình.

BỐ CỤC CỦA ĐỀ TÀI

Nội dung của đề tài được trình bày như sau:

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

TÀI LIỆU THAM KHẢO luan van tot nghiep download luanvanfull moi nhat z z @gmail.com Luan van thac si

CƠ SỞ LÝ THUYẾT

CƠ SỞ LÝ THUYẾT

Mảng là một dãy có thứ tự (về mặt vị trí) các phần tử với hai đặc điểm sau : + Số lượng phần tử cố định

+ Mọi phần tử đều có cùng kiểu dữ liệu (dữ liệu cơ sở của mảng)

1.2 Các đặc trưng cơ bản:

- Cho phép truy cập ngẫu nhiên đến từng phần tử Thời gian truy cập đến mọi phần tử đều bằng nhau

- Số lượng phần tử của mảng là cố định

Cấu trúc lưu trữ cơ bản nhất là sử dụng địa chỉ được tính toán để lưu trữ và tìm kiếm các phần tử, thường là mảng một chiều hoặc vectơ.

Các phần tử trong bộ nhớ được sắp xếp gần nhau và theo thứ tự tăng dần của chỉ số, giúp dễ dàng xác định địa chỉ của bất kỳ phần tử nào khi biết chỉ số tương ứng.

1.4 Các phép toán cơ bản:

Mảng thường chỉ bao gồm các phép tạo lập, tìm kiếm và cập nhật phần tử Mỗi phần tử trong mảng được xác định bởi chỉ số, thể hiện thứ tự của nó Vectơ là mảng một chiều với mỗi phần tử ai tương ứng với chỉ số i, trong khi ma trận là mảng hai chiều với mỗi phần tử aij tương ứng với hai chỉ số i và j.

- Một đối tượng là đệ quy nếu nó bao gồm chính nó như một bộ phận hoặc nó được định nghĩa dưới dạng của chính nó

- Một thủ tục được gọi là đệ quy nếu trong quá trình thực hiện nó phải gọi đến chính nó nhưng với kích thước nhỏ hơn của tham số.

- Trong thân của một hàm, nếu nó gọi tới chính hàm đó để xử lý bài toán thì gọi là hàm đệ quy.

1) Định nghĩa số tự nhiên:

- là một số tự nhiên

- n là số tự nhiên nếu n-1 là số tự nhiên

2) Định nghĩa hàm giai thừa:

2.2 Cấu trúc chính của một chương trình đệ quy:

Một chương trình đệ quy về căn bản gồm 2 phần:

Trong đó, chứa các tác động của hàm hoặc thủ tục với một số giá trị cụ thể ban đầu của tham số (hay gọi trường hợp dừng).

Ví dụ : if n=1 then gt:=1;

Tác động cần được thực hiện cho giá trị hiện tại của các tham số được xác định dựa trên các tác động đã được định nghĩa trước đó với kích thước nhỏ hơn của tham số.

Ví dụ: if n>1 then gt:=n*gt(n-1); luan van tot nghiep download luanvanfull moi nhat z z @gmail.com Luan van thac si

- Mỗi một lần hàm tự gọi đệ quy đến nó thì máy tính sẽ tự tạo ra một biến cục bộ mới

- Có bao nhiêu lần hàm gọi đệ quy thì sẽ có bấy nhiêu lần thoát ra khỏi hàm (kiểu như lặp hàm)

Khi thoát khỏi hàm đệ quy, các biến cục bộ được tạo ra trong quá trình đệ quy sẽ được giải phóng trước, trước khi các biến cục bộ được sinh ra sau đó.

- Sử dụng đệ quy là một phương pháp làm cho chương trình ngắn gọn, dễ hiểu nhưng nó sẽ làm tốn bộ nhớ và thời gian

Hàm tính giai thừa của n (tính n!):

Function giaithua(n:word):integer; begin if n=0 then giaithua:=1 else giaithua:=giaithua(n-1)*n; end;

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 hiện như sau:

- Khi có lệnh gọi hàm, chẳng hạn: n := gt(3);

- Thì máy sẽ ghi nhớ là: gt(3) := 3 * gt(2); và đi tính gt(2)

- Kế tiếp máy lại ghi nhớ: gt(2) := 2 * gt(1); và đi tính gt(1)

- Theo định nghĩa của hàm thì: luan van tot nghiep download luanvanfull moi nhat z z @gmail.com Luan van thac si gt(1) := 1;

- Máy sẽ quay ngược lại: gt(2) := 2 * 1; cho kết quả là 2

- gt(3) := 3 * 2; cho kết quả là 6

- Như vậy kết quả cuối cùng trả về là 6 Ta có: 3! = 6

- Đ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 trên các ngôn ngữ lập trình.

- Nhược điểm lớn nhất là tốn bộ nhớ.

- Mất nhiều thời gian xử lý, làm giảm tốc độ chạy chương trình.

Đệ quy là một phương pháp lập trình quan trọng và cũng là một cách tiếp cận để giải quyết vấn đề một cách tổng quát, tuy nhiên, không phải mọi ngôn ngữ lập trình đều hỗ trợ nó.

+ Đơn giản hoá công việc + Phân vùng để xử lý

3 Khử đệ quy: Đệ quy là quả tim trong các nghiên cứu lý thuyết cũng như thực hành tính toán, đã thể hiện rất nhiều sức mạnh và có ưu điểm trong nhiều bài toán Nhưng có đôi khi, sự hạn hẹp của bộ nhớ dành cho chương trình con không cho phép chúng ta làm điều đó.Vì vậy vấn đề khử đệ quy lại cần được quan tâm, xem xét luan van tot nghiep download luanvanfull moi nhat z z @gmail.com Luan van thac si

Quá trình chuyển đổi một giải thuật đệ quy thành giải thuật không đệ quy có thể thực hiện bằng cách sử dụng vòng lặp hoặc bộ nhớ Stack tự tạo.

- Sử dụng vòng lặp: Với ý tưởng là chúng ta lưu lại các giá trị của lần tính toán trước làm dữ liệu cho việc tính toán của lần sau

Ví dụ: Khử đệ quy trong bài toán giai thừa bằng cách sử dụng vòng lặp int giaithua (int n)

Sử dụng bộ nhớ Stack cho phép lưu trữ tất cả giá trị của các biến cục bộ và địa chỉ của chỉ thị kế tiếp Điều này quy định các giá trị tham số cho thủ tục và chuyển đến vị trí bắt đầu của thủ tục, thực hiện từng câu lệnh một cách tuần tự Sau khi thủ tục hoàn tất, địa chỉ trả về và các giá trị của biến cục bộ sẽ được lấy ra khỏi ngăn xếp, khôi phục các biến và chuyển đến địa chỉ trả về.

NGÔN NGỮ LẬP TRÌNH

C# là ngôn ngữ lập trình hướng đối tượng do Microsoft phát triển, đóng vai trò quan trọng trong kế hoạch NET của họ Ngôn ngữ này được xây dựng dựa trên C++ và Java, với thiết kế của Anders Hejlsberg, một kiến trúc sư phần mềm nổi tiếng Ông cũng là người đứng đầu nhóm thiết kế Borland Delphi, một trong những sản phẩm thành công đầu tiên trong việc phát triển môi trường lập trình tích hợp (IDE) cho lập trình Client/Server.

C# là ngôn ngữ lập trình điều khiển sự kiện, cho phép lập trình viên sử dụng IDE (Môi trường phát triển tích hợp) để tạo, chạy, kiểm tra và gỡ lỗi các chương trình Nền tảng NET hỗ trợ tương tác giữa các thành phần phần mềm viết bằng các ngôn ngữ khác nhau, giúp người phát triển có thể tích hợp và sử dụng lại các phần mềm cũ trong các ứng dụng C# mới.

C# hỗ trợ các kiểu dữ liệu cơ bản như integer, float, boolean, string, và array, cùng với các câu lệnh điều khiển như if, while, for, switch, và do…while Tuy nhiên, C# cũng có những đặc điểm riêng biệt mà người dùng cần lưu ý.

2 Đặc điểm của ngôn ngữ C#:

C# là ngôn ngữ lập trình phản ánh rõ nét nhất NET Framework, nơi mà tất cả các chương trình NET hoạt động và nó có sự phụ thuộc mạnh mẽ vào Framework này.

Trong ngôn ngữ C#, không tồn tại khái niệm biến toàn cục và hàm Tất cả các hàm và phương thức đều được khai báo trong một lớp, và mọi kiểu biến, kể cả các kiểu giá trị đơn giản, đều được coi là đối tượng Thay vì sử dụng biến toàn cục và hàm, ta có thể sử dụng thuộc tính static cho các hàm và biến trong lớp được khai báo là public.

C# yêu cầu kiểu Boolean (bool) rất nghiêm ngặt, với các câu lệnh điều kiện như while và if bắt buộc phải sử dụng biểu thức có kiểu bool.

Trong C++, biểu thức trong câu lệnh if có thể được chuyển đổi thành giá trị kiểu bool, cho dù biến a được khai báo là kiểu int hay pointer Ngược lại, C# không có khái niệm "a nguyên là đúng hay sai", điều này yêu cầu lập trình viên phải sử dụng các biểu thức có kiểu trả về chính xác là bool.

C++ hỗ trợ đa thừa kế, mang lại sức mạnh nếu được sử dụng đúng cách Tuy nhiên, việc quản lý đa thừa kế rất phức tạp, dẫn đến khó khăn trong việc áp dụng Đây là lý do chính khiến C# chỉ phát triển thừa kế đơn.

Namespaces trong C# là tập hợp các lớp có mối liên hệ, giúp tổ chức mã nguồn và tránh xung đột tên lớp Ví dụ, các lớp liên quan đến cơ sở dữ liệu có thể được gom lại trong một namespace chung gọi là DataActivity C# yêu cầu tên lớp phải bao gồm namespace để tránh xung đột, như DataActivity.Connection và InternetActivity.Connection Điều đặc biệt là namespaces trong C# không ánh xạ vật lý như trong Java, cho phép các lớp cùng namespace nằm ở nhiều thư mục khác nhau Ngoài lớp, namespace còn có thể chứa sự kiện, exception và các namespace khác.

Chương II: PHƯƠNG PHÁP QUAY LUI

Kỹ thuật quay lui (backtracking) là một phương pháp phân tích theo chiều sâu, cho phép liệt kê và thử nghiệm các khả năng cho đến khi tìm ra lời giải đúng Thuật toán này chia nhỏ bài toán lớn thành các bài toán phần tử, và trong quá trình tìm kiếm, nếu gặp phải hướng không khả thi, nó sẽ quay lại bước trước để tìm hướng khác Quá trình này tiếp tục cho đến khi không còn hướng nào khả thi, lúc đó thuật toán sẽ kết thúc.

Thuật toán quay lui có thể được thể hiện theo sơ đồ cây tìm kiếm theo chiều sâu như hình dưới:

Khả năng x2với x 1 đã chọn

Khả năng x 3 với x1và x2đã chọn

Khả năng x4 với x1, x2và x 3 đã chọn

Một đáp án X3 luan van tot nghiep download luanvanfull moi nhat z z @gmail.com Luan van thac si

Từ hình vẽ, dẽ dàng nhận thấy:

Trong một bài toán hiện tại, chúng ta tìm kiếm lời giải cho từng nốt Dựa trên lời giải đó, chúng ta tiếp tục giải quyết các bài toán tiếp theo cho đến khi bài toán gốc được hoàn thiện.

- Lời giải của bài toán gốc thường là một lối đi từ gốc đến nốt cuối cùng (không có nốt con)

* Tư tưởng của thuật toán:

- Nét đặc trưng của kĩ thuật quay lui là các bước hướng tới lời giải cuối cùng của bài toán hoàn toàn được làm thử

Tại mỗi bước, nếu có một lựa chọn được chấp nhận, hãy ghi nhận lựa chọn đó và tiếp tục với các bước thử tiếp theo Nếu không có lựa chọn nào phù hợp, hãy quay lại bước trước, xóa bỏ sự ghi nhận và tiếp tục thử các lựa chọn còn lại.

Thuật toán cần ghi nhớ từng bước đi qua để tránh trùng lặp trong quá trình quay lui, và thông tin này được lưu trữ trong một ngăn xếp (Stack) theo nguyên tắc vào sau ra trước Do đó, thiết kế của thuật toán mang tính chất đệ quy.

Thuật toán quay lui thường được triển khai dưới dạng đệ quy, trong đó mỗi lần gọi hàm đệ quy sẽ nhận một tham số là chỉ số của bài toán con Hàm này sẽ tìm kiếm lời giải cho bài toán con; nếu tìm thấy, nó sẽ tiếp tục gọi hàm đệ quy để giải quyết bài toán con tiếp theo hoặc đưa ra đáp án cho bài toán lớn nếu đã có đủ lời giải Nếu không tìm thấy, chương trình sẽ quay lại điểm gọi hàm trước đó Việc sử dụng hàm đệ quy giúp thuật toán trở nên rõ ràng, dễ viết và dễ hiểu, đồng thời bảo toàn các biến và trạng thái trong quá trình giải quyết bài toán con.

II MÔ HÌNH CỦA BÀI TOÁN:

Lời giải của bài toán được biểu diễn bằng một véc tơ với n thành phần, cần thỏa mãn các điều kiện nhất định Để xác định lời giải x, chúng ta phải xây dựng từng thành phần của véc tơ x = (x1, x2, , xn).

- Đã xây dựng xong các thành phần x=(x1,x2, xn)

- Xây dựng thành phần xi bằng cách lần lượt thử tất cả các khả năng mà xi có thể chọn:

BÀI TOÁN SUDOKU

GIỚI THIỆU BÀI TOÁN

Trò chơi Sudoku, được thiết kế bởi kiến trúc sư Howard Garns tại New York, lần đầu tiên xuất hiện vào năm 1979 trên tạp chí Dell với tên gọi "Number Place" Vào tháng 4 năm 1984, trò chơi này được giới thiệu tại Nhật Bản trên báo Monthly Nikolist với tên gọi "Suuji wa dokusinh ni kagiru", có nghĩa là "những con số phải độc nhất" Từ đó, tên gọi đã được rút gọn thành SuDoKu, trong đó "su" có nghĩa là số và "doku" có nghĩa là đơn lẻ.

Trò chơi SuDoKu chỉ thực sự trở nên phổ biến khi người Anh tham gia Vào ngày 12/11/2004, báo Times đã giới thiệu trò chơi này với tên gọi “SuDoKu”, dựa trên chương trình phát triển của Wayne Gould, một quan tòa về hưu người New Zealand sống tại Hongkong Sau đó, SuDoKu nhanh chóng xuất hiện trên hầu hết các tờ báo hàng đầu của Anh và được đưa đến Australia nhờ tập đoàn báo chí Telegraph.

Từ ngày 2/8/2005, chương trình Radio Times của đài BBC đã giới thiệu chuyên đề Super SuDoKu, đánh dấu sự phát triển của trò chơi này SuDoKu lần đầu xuất hiện trên truyền hình vào ngày 1/7/2005 trong chương trình SuDoKu Live trên kênh Sky One, nơi 9 đội thi đấu để tạo ra bảng SuDoKu lớn nhất thế giới tại Chipping Sodbury, Anh Hiện nay, SuDoKu đã trở thành một hiện tượng toàn cầu, xuất hiện trên các báo và tạp chí hàng đầu, thu hút sự quan tâm tại hơn 40 quốc gia, bao gồm cả Việt Nam.

SuDoKu xuất hiện tại Việt Nam sớm nhất là trên tạp chí Khám Phá (Trực thuộc

Sở Khoa học và Công nghệ Thành phố Hồ Chí Minh đã phát triển các hình thức giải trí trí tuệ cho giới trẻ, trong đó có báo Thanh Niên và Hoa Học Trò Đặc biệt, mục Vua trò chơi trên báo Hoa Học Trò với trò chơi SuDoKu đã thu hút đông đảo học sinh tham gia, theo kết quả công bố của báo.

2 Luật chơi: Quy luật của trò chơi tương đối đơn giãn.Cho một bàn hình vuông được chia thành một lưới 81 ô nhỏ gồm 9 hàng và 9 cột, 81 ô nhỏ đó lại được chia thành 9 vùng, mỗi vùng có 9 ô Đề bài SuDoKu là một bàn hình vuông như thế, trên đó tại một số ô người ta đã điền sẵn một số giá trị Cách chơi như sau:

 Phải điền các số từ 1 đến 9 vào mỗi hàng dọc, ngang không được trùng lặp

 Ở mỗi hàng dọc, mỗi hàng ngang và mỗi ô vuông 3*3 được phân cách rõ ràng ( bằng gạch đen đậm) luôn phải đảm bảo có đủ các số từ 1 đến 9

Mỗi hàng dọc, hàng ngang và ô vuông 3x3 trong trò chơi được phân cách rõ ràng bằng các đường gạch đen đậm, đảm bảo rằng các số chỉ được sử dụng một lần và không lặp lại.

Sử dụng các số từ 1 đến 9 để điền vào các ô còn lại trong bài tập Đáp án cho đề bài này sẽ được cung cấp.

Ngoài khuôn dạng chuẩn có kích thước 9x9 ô, chia làm 3x3 vùng, SuDoKu còn có rất nhiều biến thể khác Một số biến thể phổ biến như:

- Kích thước 4x4 ô chia làm 2x2 vùng

- Kích thước 6x6 ô chia làm 2x3 vùng

- Kích thước 5x5 ô chia vùng theo pentomino (được phát hành với tên goi Logi-5)

- Kích thước 7x7 ô chia vùng theo heptomino

- Kích thước 8x8 ô chia vùng theo qui tắc (4x2):(4x2) Đây là cách chia thành

Bài viết mô tả cấu trúc của một trò chơi Sudoku mới, trong đó có 4 vùng chính, mỗi vùng gồm 16 ô Mỗi vùng chính được chia thành 2 vùng 8x8 dựa trên màu nền của các ô Sự sắp xếp các ô khác màu tạo ra nhiều biến thể khác nhau, với cách bố trí đơn giản nhất là các ô khác màu xen kẽ nhau, tương tự như bàn cờ quốc tế Trò chơi này được phát triển bởi người Việt Phạm Văn Hải với tên gọi Sudoku Plus 8x8.

Biến thể với kích thước lớn hơn cũng khá phổ biến:

- Kích thước 12x12 ô chia làm 4x3 vùng (Dodeka SuDoKu)

- Kích thước 25x25 ô (Giant SuDoKu) Biến thể với kích thước lớn nhất được phổ biến là 100x100 ô.

XÂY DỰNG CẤU TRÚC DỮ LIỆU CHO BÀI TOÁN

1 Một ô số SuDoKu bao gồm 9 miền con (hay còn gọi là 9 vùng), đặt theo thứ tự là

1, 2, 3, 4, 5, 6, 7, 8, 9 Chia thành 9 hàng và 9 cột như hình sau:

2 Dữ liệu sử dụng trong chương trình là dữ liệu kiểu mảng :

Hàng luan van tot nghiep download luanvanfull moi nhat z z @gmail.com Luan van thac si

Trong đó giá trị row[i,j] nhận 2 giá trị quy ước là 0 và 1

 row[i,j]=0 tức là hàng i không thể điền thêm giá trị j vào bất cứ ô nào nữa vì giá trị j đã tồn tại trong hàng i

Ví dụ: Giả sử đề bài có hàng thứ 2 được cho như sau:

 row[i,j]=1 tức là hàng i có thể điền thêm giá trị j vào bất cứ ô nào chưa được điền của hàng i

Ví dụ: Với ví dụ trên thì row[2,9]=1

- int [,] column=new int[10,10]; là mảng 2 chiều dùng để đánh dấu cột có thể điền một số nào đó hay không

Trong đó column[i,j] nhận 2 giá trị là 0 và 1

 column[i,j]=0 cột i không thể điền giá trị j vào

 column[i,j]=1 cột i có thể điền giá trị j vào

Ví dụ: Đề bài có cột thứ 2 được cho như sau:

Chỉ những giá trị chưa được điền trong cột mới có thể được cập nhật, và những giá trị này sẽ có giá trị trả về là 1.

Mảng hai chiều được khai báo bằng cú pháp int [,] area=new int[10,10]; tương tự như mảng row[i,j] và column[i,j] Mảng area[i,j] được sử dụng để đánh dấu vùng có thể điền giá trị hay không, với area[i,j] nhận hai giá trị 0 và 1 Nếu area[i,j]=0, vùng i không thể điền giá trị j, trong khi nếu area[i,j]=1, vùng i có thể điền giá trị j.

Ví dụ: Giả sử đề bài cho vùng thứ 2 có các giá trị sau:

- int [,] AREA=new int[10,10]; là mảng cố định, dùng để thiết lập giá trị mặc định của chỉ số vùng

Trong đó AREA[i,j] nhận các giá trị từ 1 đến 9 i: chỉ số hàng j: chỉ số cột Giá trị trả về của AREA là chỉ số vùng

Khi đó, vùng area[2,7] và area[2,1] đều bằng 0, có nghĩa là vùng 2 chỉ có thể được điền các giá trị chưa có trong vùng đó Giá trị 1 có thể được điền vào.

Ví dụ: AREA[4,5] sẽ trả về giá trị là 5 Tức là hàng 4 cột 5 là thuộc vùng 5

Mảng 3 chiều `agree` được khai báo với kích thước 10x10x11, dùng để đánh dấu số lượng và các giá trị có thể điền vào từng ô trống Trong đó, giá trị `agree[i,j,k]` nhận các giá trị từ 1 đến 9, với `i` và `j` đại diện cho hàng và cột, còn `k` nhận giá trị từ 0 đến 9.

 Với k=0 và giá trị trả về của agree[i,j,0] là h: nghĩa là ô hàng i cột j có h khả năng điền

 Với k:19 thì các giá trị agree[i,j,1], agree[i,j,2], agree[i,j,3]… agree[i,j,k] là các khả năng điền đó luan van tot nghiep download luanvanfull moi nhat z z @gmail.com Luan van thac si

Ví dụ: Giả sử đề bài cho vùng thứ 1 có các giá trị sau:

- int[,] value = new int[10,10]; là mảng 2 chiều dùng để chỉ giá trị đang được điền hiện tại tại một ô bất kì

Value=[i,j] nhận các giá trị từ 1 đến 9

Ví dụ: Với ví dụ trên, nếu value[1,1]=2 thì ô hàng1 cột 1 đang được đánh số thứ 2 trong 5 khả năng được điền, tức là ô hàng 1 cột 1 đang được điền số 2

Bằng cách sử dụng các phương pháp đánh dấu này, chúng ta có thể dễ dàng xem xét các khả năng điền số của một ô, từ đó loại bỏ những khả năng không thuận lợi khi đã xác định được chúng.

Giả sử ô hàng 1 cột 1 nhận 7 giá trị là:

Khi đó, giá trị agree[1,1,0] bằng 7, và các giá trị tương ứng là: agree[1,1,1] = 1, agree[1,1,2] = 2, agree[1,1,3] = 3, agree[1,1,4] = 4, agree[1,1,5] = 6, agree[1,1,4] = 8, và agree[1,1,5] = 9 Điều này có nghĩa là vùng 1 chỉ được phép điền các giá trị chưa có trong vùng đó, và giá trị trả về là 1, cho thấy có thể điền được.

THUẬT TOÁN

1.1.1 Thông tin vào: Đề SuDoKu, là một bảng số cho bởi file hoặc có thể nhập trực tiếp trên giao diện người dùng

- Nếu đề bài có nhiều đáp án thì phải xuất được nhiều đáp án

- Nếu không có lời giải thì phải thông báo SuDoKu không có đáp án

1.2 Cách xác định mỗi ô số bất kỳ:

1.2.1 Xác định các ô theo số thứ tự từ 1 đến 81:

Cách này ta sử dụng chủ yếu để tạo ra đề bài hoặc xuất kết quả ra giao diện người dùng Ta có bảng sau:

64 65 66 67 68 69 70 71 72 luan van tot nghiep download luanvanfull moi nhat z z @gmail.com Luan van thac si

1.2.2 Xác định bằng [hàng, cột]:

Với cách xác định này, ta dễ dàng duyệt theo chiều của cột, hàng Ta có bảng sau:

1.2.3 Xác định bằng [vùng, số thứ tự trong vùng]:

Cách xác định này cho phép ta duyệt theo vùng Ta có bảng sau:

{4,5} {4,6} {5,4} {5,5} {5,6} {6,4} {6,5} {6,6} luan van tot nghiep download luanvanfull moi nhat z z @gmail.com Luan van thac si

Kết luận: Để ý cách 1 và cách 2 dễ dàng chuyển đổi qua lại lẫn nhau bởi công thức:

 Chuyển từ dạng 1 sang dạng 2 x[i,j] int tox(int x)

 Chuyển từ dạng 2 sang dạng 1 int tou(int i, int j)

} Đối với dạng 3 thì ta lưu thành mảng AREA để sử dụng, trong mảng này, mỗi giá trị AREA[i,j]= số thứ tự ở dạng 1

Chương trình giải sử dụng thuật toán quay lui, trong đó mỗi trường hợp giải được của bài toán phần tử sẽ dẫn đến việc tìm kiếm lời giải cho bài toán phần tử tiếp theo, cho đến khi bài toán lớn hoàn thiện.

void Try(int i) {

Khi xem xét vị trí thứ i, chúng ta cần đưa ra các phương án cho vị trí i+1 Một số phương án sẽ dẫn đến kết quả khả thi cho các vị trí tiếp theo, trong khi những phương án khác sẽ không có kết quả, được gọi là phương án bất khả thi Để tối ưu hóa tốc độ chạy của chương trình, việc loại bỏ các phương án bất khả thi là rất quan trọng, và càng loại bỏ được nhiều phương án này càng tốt.

Thuật toán có thể được biểu diễn bằng đệ quy, nhưng việc cài đặt theo cách này không hiệu quả do tiêu tốn bộ nhớ stack và gọi hàm nhiều lần, dẫn đến hiệu suất chậm Thay vào đó, có thể cài đặt thuật toán không đệ quy, nhưng vẫn giữ nguyên tinh thần giải quyết vấn đề theo phương pháp đệ quy Để thực hiện điều này, cần có cách tiếp cận cho phép di chuyển và thử nghiệm các khả năng trên các ô một cách dễ dàng.

3 Giải quyết vấn đề: luan van tot nghiep download luanvanfull moi nhat z z @gmail.com Luan van thac si

 Khởi tạo, tất cả các ô trống đều có 9 khả năng điền từ 1 đến 9

9 luan van tot nghiep download luanvanfull moi nhat z z @gmail.com Luan van thac si

 Tạo 1 stack để lưu các ô đã được điền Cứ mỗi ô [i,j] đã được điền giá trị NewValue, ta tiến hành các thao tác như sau:

Đánh dấu ô [i,j] với giá trị NewValue đã được điền, trong khi các giá trị row[i,j], collum[i,j], và area[i,j] sẽ được đặt bằng 0 để thể hiện rằng ô này không còn trống.

 Đặt giá trị ở vùng [i,j] như sau: agree[i,j,0]=1 (Chỉ 1 giá trị có thể điền), agree[i,j,1]= NewValue, value[i,j]=1.

 Với các ô trên hàng, cột, vùng chứa ô đó (tất nhiên phải khác ô đó) ta loại bỏ khả năng điền số NewValue ra khỏi tập các khả năng

Ví dụ: Ô [1,4] đã được điền số 1

1 9 1 9 1 9 2 9 1 9 1 9 1 9 1 9 1 9 luan van tot nghiep download luanvanfull moi nhat z z @gmail.com Luan van thac si

Ta sẽ tìm các ô chưa được xét và đưa vào stack, tiếp tục xử lý cho đến khi không còn ô nào thỏa mãn điều kiện.

 Là ô duy nhất của hàng (hoặc cột, hoặc vùng) có thể điền một số nào đó

Ví dụ: Tại hàng số 4 chỉ có thể điền số 5 tại ô ở cột 6 (dấu X), như vậy ta sẽ xóa khả năng điền được số 5 tại các ô đánh dấu (-)

Ô [5,6] chỉ có khả năng điền số 7, do đó các ô đánh dấu (-) có thể loại bỏ số 7 khỏi tập phương án.

- luan van tot nghiep download luanvanfull moi nhat z z @gmail.com Luan van thac si

Nếu trong quá trình kiểm tra có hàng, cột hoặc vùng nào không thể điền giá trị, kết quả sẽ là không có nghiệm Ngoài ra, nếu có một ô nào không thể điền, thì SuDoKu cũng sẽ không có nghiệm.

3.2 Vấn đề 2: Khử đệ quy trong thuật toán

Tư tưởng chính là việc sử dụng một biến để điều khiển di chuyển giữa các ô số Để dễ dàng di chuyển, ta xác định ô số đầu tiên Biến điều khiển "add" có giá trị 1 khi tiến lên phía trước và -1 khi quay về phía sau, trong khi biến "index" chỉ vị trí hiện tại Sự kết hợp của hai biến này tạo ra sự nhịp nhàng giữa các ô mà không cần sử dụng đệ quy.

Cách khử đệ quy để tìm ra đáp án được tóm tắt trong thuật toán cơ bản sau :

 Bước 1 : index =1 (Đang xét ô 1) add=1 (đang tiến)

 Bước 2 : Lặp trong khi vị trí tiếp ta xét là lớn hơn 0

 Nếu index = (nghĩa là từ ô 1 đến ô 81 đã đúng), ta đưa ra kết quả và thoát

 Nếu ô hiện tại chỉ có 1 khả năng thì tiếp tục vòng lặp (Ta không xét những ô này), những ô này luôn có giá trị value[,] bằng 1

Nếu ô hiện tại có nhiều giá trị và giá trị đang xét là giá trị lớn nhất, không thể tăng giá trị tại ô đó, ta sẽ đặt nó về giá trị nhỏ nhất, gán add = -1 và tiếp tục vòng lặp, quay lại ô trước đó.

Khi tìm thấy giá trị thỏa mãn, chúng ta sẽ tạo ràng buộc đã điền giá trị trong cột, hàng và ô chứa giá trị đó Đặt biến add=1, sau đó tiếp tục vòng lặp để tiến đến ô liền kề tiếp theo.

Nếu không tìm thấy giá trị, ta gán add = -1 và tiếp tục vòng lặp để kiểm tra ô liền trước đó.

Giá trị trong tập khả năng có thể điền cho ô hiện tại phải đạt 2 yêu cầu:

Chưa được điền trong hàng, cột, vùng chứa nó

Xây dựng một cấu hình SuDoKu theo thứ tự từ điển yêu cầu tìm kiếm giá trị lớn hơn hoặc bằng giá trị hiện tại.

Chúng ta không chỉ cần tìm một đáp án mà còn phải đếm số lượng đáp án, đồng thời kiểm tra xem đáp án đó có phải là đầu tiên hay không Do đó, từ thuật toán cơ bản, chúng ta cần thực hiện một số điều chỉnh.

 Ta tạo biến ResultCount để đếm số đáp án đã tìm được, cứ hễ tìm thấy đáp án thì ta tăng biến này thêm 1

 Ta thêm tham số count cho hàm, tham số về số kết quả

Nếu count = -1, điều này có nghĩa là chúng ta đang đếm số kết quả Trong trường hợp này, chúng ta sẽ không xuất kết quả Nếu ResultCount lớn hơn số kết quả tối đa cần tìm hoặc không tìm thấy kết quả nào, chúng ta sẽ trả về giá trị của ResultCount.

Nếu count bằng 0, chương trình sẽ thực hiện theo thuật toán cơ bản Khi tìm thấy kết quả, nó sẽ xuất ra và trả về giá trị 1; nếu không tìm thấy, chương trình sẽ trả về 0.

GIỚI THIỆU CHƯƠNG TRÌNH GIẢI

Tạo mới: Xóa tất cả các text, sẵn sàng để nhập đề bài mới

Load từ tập tin : Mở đề bài từ tập tin đã được lưu sẵn

Lưu: Lưu đề bài ra tập tin để có thể mở vào thời gian khác

Thống kê: Liệt kê số các ô số còn trống, các ô số đã được điền, số đáp án, và thời gian

Xuất bản: Lưu bài SuDoKu dưới dạng Rich Text Format (.rtf) để mở bằng

Winword hoặc html để mở bằng trình duyệt web luan van tot nghiep download luanvanfull moi nhat z z @gmail.com Luan van thac si

Giải đề bài đang nhập để tìm đáp án đầu tiên (nếu có) Đáp án thứ: Giải đề đến đáp án do người dùng chỉ định và xuất ra (nếu có) Đáp án trước: Giải và xem đáp án liền trước đáp án đang xem Đáp án sau: Giải và xem đáp án liền sau đáp án đang xem (nếu có).

Thứ tự Phím tắt Chức năng

1 Right, Enter, Tab Di con trỏ đến ô kế tiếp

2 Left, Shift + Tab Di con trỏ đến ô trước

3 Up Di con trỏ đến ô phía trên

4 Down Di con trỏ đến ô phía dưới

5 Home Di con trỏ đến ô đầu hàng

6 End Di con trỏ đến ô cuối hàng

7 Page up Di con trỏ đến ô hàng trên cùng

8 Page down Di con trỏ đến ô hàng dưới cùng

10 Space, Bkspace Xóa trống một ô luan van tot nghiep download luanvanfull moi nhat z z @gmail.com Luan van thac si

Ngày đăng: 22/07/2023, 16:04

HÌNH ẢNH LIÊN QUAN

3. Bảng phím tắt: - (Luận văn) nghiên cứu phương pháp quay lui và ứng dụng giải bài toán sudoku
3. Bảng phím tắt: (Trang 48)

🧩 Sản phẩm bạn có thể quan tâm