GIỚI THIỆU VỀ SUDOKUtt Luật chơi: Dựa vào gợi ý là các số có sẵn trong đề Sudoku, ta tiến hành điền vào các ô trống còn lại một số trong dãy số từ 1 đến 9, sao cho ở mỗi dòng, mỗi cột,
Trang 1ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
Trang 2MỤC LỤC
1 GIỚI THIỆU VỀ SUDOKU
2 THUẬT TOÁN
3 GIAO DIỆN
Trang 31 GIỚI THIỆU VỀ SUDOKU
Trang 41 GIỚI THIỆU VỀ SUDOKU(tt)
Sudoku là một trò chơi trí tuệ
Ra đời tại Nhật
Có rất nhiều dạng 9x9, 3x3, 6x6, 16x16, 25x25,…
Dạng chuẩn 9x9: 9 dòng, 9 cột, 9 phân vùng nhỏ
Trang 51 GIỚI THIỆU VỀ SUDOKU(tt)
Luật chơi:
Dựa vào gợi ý là các số có sẵn trong đề
Sudoku, ta tiến hành điền vào các ô trống còn lại một số trong dãy số từ 1 đến 9, sao cho ở mỗi dòng, mỗi cột, mỗi vùng không
có số nào bị lặp lại
Trang 6Phân tích bài toán
Xác định:
Input: Đề sudoku
Output: Đáp án
Trang 72 THUẬT TOÁN
Sử dụng thuật toán suy diễn lùi
Suy diễn lùi là một chiến lược tìm kiếm lời giải
cho các bài toán thỏa mãn ràng buộc
Đó là một quá trình tìm kiếm theo độ sâu trong
một tập hợp các lời giải Trong quá trình tìm kiếm, nếu ta gặp một hướng lựa chọn không thỏa mãn, ta quay lui về điểm lựa chọn nơi có các hướng khác và thử hướng lựa chọn tiếp theo Khi đã thử hết các lựa chọn xuất phát từ điểm lựa chọn đó, ta quay lại
điểm lựa chọn trước đó và thử hướng lựa chọn tiếp theo tại đó Quá trình tìm kiếm thất bại khi không còn điểm lựa chọn nào nữa.
Trang 82 THUẬT TOÁN (tt)
trong đó mỗi thể hiện của hàm lấy thêm một
biến và lần lượt gán tất cả các giá trị có thể cho biến đó, với mỗi lần gán trị lại gọi chuỗi đệ
quy tiếp theo để thử các biến tiếp theo
Trang 10Giải quyết vấn đề 1
- Khởi tạo tất cả các ô đều có 9 khả năng điền 1 9
- Tạo stack lưu các ô đã điền
- Thực hiện việc đánh dấu trên ô[i,j] row[i ,newvalue]=0
column[j, newvalue]=0 area[AREA[i,j], newvalue]=0
- Đặt giá trị ở ô [i,j]
Agree[i,j,0]=1 Agree[i,j,1]=newvalue value[i,j]=1
- Trên hàng, cột, vùng chứa ô [i,j] đó ta loại khả năng điền số newvalue ra khỏi tập khả năng
Trang 11Giải quyết vấn đề 1 (tt)
Ví dụ:
Ô [3,4] điền
số 1
Trang 12Giải quyết vấn đề 1 (tt)
Tìm số chưa được xét đưa vào stack và xử lý như trên cho đến khi không tìm thấy ô nào nữa Đó là các ô thỏa:
- Là ô duy nhất của hàng (cột, vùng) có thể điền một số nào đó
- Là ô chỉ có một khả năng điền
Trang 13Giải quyết vấn đề 1 (tt)
Ô X là ô duy nhất có thể điền số 5
Ô X là ô chỉ có một khả năng điền số 7
Trang 15Giải quyết vấn đề 2 (tt)Thuật toán cơ bản:
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 == 82 (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ó value[,] bằng 1
Nếu ô hiện tại có giá trị chính là giá trị tối đa, nghĩa là không thế tăng lên nữa, thì ta cho nó về giá trị nhỏ nhất, cho add = -1, tiếp tục vòng lặp, lùi về ô trước nó
Ta cần thay đổi giá trị trên ô số hiện thời nên giá trị cũ bị bỏ Những ràng buộc của giá trị cũ đối với hàng, cột và vùng cũng bị bỏ
Tìm giá trị trong tập khả năng có thể điền cho ô hiện tại, giá trị đó phải chưa được điền trong hàng, cột, vùng chứa nó và lớn hơn hoặc bằng giá trị hiện thời (xây dựng cấu hình sudoku theo chiều hướng tăng)
Nếu ở bước trên
◦ Tìm thấy giá trị thỏa mãn thì ta tạo ràng buộc đã điền giá trị trong cột, hàng, ô chứa ô số đó Cho add = 1, sau đó tiếp tục vòng lặp để tiến tới ô phía sau
◦ Nếu không tìm thấy thì ta cho add = -1, tiếp tục vòng lặp ta xét ô liền trước nó
Trang 163 GIAO DIỆN
Trang 173 GIAO DIỆN (tt)
đáp án)
án)
một đề sudoku
Trang 183 GIAO DIỆN (tt)
• Skins: thay đổi giao diện chương trình
• Help: Giới thiệu luật chơi
• About: Giới thiệu thông tin nhóm
Trang 193 GIAO DIỆN (tt)
Nạp đề:
-Nhập từng số vào -Mở đề từ file
Đáp án
Trang 203 GIAO DIỆN (tt)
Trang 21Cám ơn sự theo dõi của các bạn!