Tìm hiểu về thuật toán quay lui (Backtracking) qua trò chơi Sudoku

Đăng lúc 08:49 28.03.2021

Thuật toán quay lui (Backtracking) là một giải thuật dựa trên đệ quy, là một giải thuật được sử dụng phổ biến trong khoa học máy tính. Trong bài này chúng ta sẽ tìm hiểu thuật toán quay lui là gì? Vận dụng thuật toán quay lui để giải trò chơi sudoku

 

 

Thuật toán quay lui là gì?

Quay lui là một kĩ thuật thiết kế giải thuật dựa trên đệ quy. Ý tưởng của quay lui là tìm lời giải từng bước, mỗi bước chọn một trong số các lựa chọn khả dĩ và đệ quy. Người đầu tiên đề ra thuật ngữ này (backtrack) là nhà toán học người Mỹ D. H. Lehmer vào những năm 1950.

Tư tưởng

Dùng để giải bài toán liệt kê các cấu hình. Mỗi cấu hình được xây dựng bằng từng phần tử. Mỗi phần tử lại được chọn bằng cách thử tất cả các khả năng.

Các bước trong việc liệt kê cấu hình dạng X[1...n]:

  • Xét tất cả các giá trị X[1] có thể nhận, thử X[1] nhận các giá trị đó. Với mỗi giá trị của X[1] ta sẽ:
  • Xét tất cả giá trị X[2] có thể nhận, lại thử X[2] cho các giá trị đó. Với mỗi giá trị X[2] lại xét khả năng giá trị của X[3]...tiếp tục như vậy cho tới bước:
  • ...
  • ....
  • Xét tất cả giá trị X[n] có thể nhận, thử cho X[n] nhận lần lượt giá trị đó.
  • Thông báo cấu hình tìm được.

Bản chất của quay lui là một quá trình tìm kiếm theo chiều sâu(Depth-First Search).

Mô hình thuật toán

  • Mã giả cho thuật toán quay lui.

Backtracking(k) {
	for([Mỗi phương án chọn i(thuộc tập D)]) {
		if ([Chấp nhận i]) {
			[Chọn i cho X[k]];
			if ([Thành công]) {
				[Đưa ra kết quả];
			} else {
				Backtracking(k+1);
				[Bỏ chọn i cho X[k]];
			}
		}
	}
}

Ví dụ: Trò chơi Sudoku

Sudoku là một trò chơi khá phổ biến và chắc ai cũng biết. Trò chơi như sau: có một hình vuông được chia thành 9x9 ô vuông con. Mỗi ô vuông con có giá trị trong khoảng từ 1 đến 9. Ban đầu hình vuông có một số ô vuông con cho trước (có điền sẵn số) và còn lại là trống. Hãy điền các số từ 1-9 vào các ô con lại sao cho: hàng ngang là các số khác nhau từ 1 đến 9, hàng dọc là các số khác nhau từ 1 đến 9, và mỗi khối 3x3 chính là các số khác nhau từ 1 đến 9. Sau đây là 1 ví dụ về đề bài và lời giải:

Áp dụng quay lui để giải bài toán sudoku. Ý tưởng: Mỗi bước tìm tập các giá trị khả dĩ để điền vào ô trống, và sau đó đệ quy để điền ô tiếp theo. Giả mã của thuật toán (ở đây chú ý mảng chỉ có kích thước 9×9×9)

void solveSudoku(int S[][9], int x, int y){
    if(y == 9){
        if(x == 8){
            printSolution(S);
            exit(0);
        } else {
            solveSudoku(S, x+1,0);
        }
    } else if(S[x][y] == 0){
        for (int k = 1; k <=9; k++){
            if(checkValid(S,x,y,k)){
                S[x][y] = k;
                solveSudoku(S, x, y+1);
                S[x][y] = 0;
            }
        }
    } else {
        solveSudoku(S,x,y+1);
    }
}

boolean checkValid(int S[][9], int x, int y, int k){
    for(int i = 0; i <9 ; i++){
        if(S[x][i] == k) return false;
    }
    for(int i = 0; i <9 ; i++){
        if(S[i][y] == k) return false;
    }
    int a = x/3, b = y/3;
    for(int i = 3*a; i < 3*a+3; i++){
        for(int j = 3*b; j < 3*b+3; j++){
            if(S[i][j] == k) return false;
        }
    }
    return true;
}

Nhận xét

  • -Ưu điểm: Việc quay lui là thử tất cả các tổ hợp để tìm được một lời giải. Thế mạnh của phương pháp này là nhiều cài đặt tránh được việc phải thử nhiều trường hợp chưa hoàn chỉnh, nhờ đó giảm thời gian chạy.

  • Nhược điểm: Trong trường hợp xấu nhất độ phức tạp của quay lui vẫn là cấp số mũ. Vì nó mắc phải các nhược điểm sau:

    • Rơi vào tình trạng "thrashing": qúa trình tìm kiếm cứ gặp phải bế tắc với cùng một nguyên nhân.
    • Thực hiện các công việc dư thừa: Mỗi lần chúng ta quay lui, chúng ta cần phải đánh giá lại lời giải trong khi đôi lúc điều đó không cần thiết.
    • Không sớm phát hiện được các khả năng bị bế tắc trong tương lai. Quay lui chuẩn, không có cơ chế nhìn về tương lai để nhận biết đc nhánh tìm kiếm sẽ đi vào bế tắc.

 
==***==

Khoá học: Quản trị Chiến lược Dành cho các Lãnh đạo Doanh nghiệp
Nhấn vào đây để bắt đầu khóa học

Khóa học: Trở thành chuyên gia Bảo mật và tấn công ANM- Hacker mũ trắng
Nhấn vào đây để bắt đầu khóa học

Chuyên gia phân tích, tự động hóa Web iMacros
Nhấn vào đây để bắt đầu khóa học

Xây dựng ứng dụng tự động hóa AutoIT
Nhấn vào đây để bắt đầu khóa học

Khóa đào tạo Hacker và Marketing Facebook từ A - Z
Nhấn vào đây để bắt đầu khóa học

Khóa học: Phân tích và trực quan hóa dữ liệu với Power BI
Nhấn vào đây để bắt đầu khóa học

Khóa học đào tạo Marketing Facebook thông minh
Nhấn vào đây để bắt đầu khóa học

Lập trình Visual Foxpro 9 - Dành cho nhà quản lý và kế toán
Nhấn vào đây để bắt đầu khóa học

Làm chủ xây dựng Game chuyên nghiệp
Nhấn vào đây để bắt đầu khóa học

Trở thành chuyên gia Marketing Facebook thông minh
Nhấn vào đây để bắt đầu khóa học

Kỹ sảo Điện ảnh đỉnh cao với khóa học After Effect
Nhấn vào đây để bắt đầu khóa học

Trở thành chuyên gia Vẽ Đẳng Cấp với khóa học AI
Nhấn vào đây để bắt đầu khóa học

Làm Chủ thiết kế ảnh với Photoshop CC
Nhấn vào đây để bắt đầu khóa học

Dựng Phim Siêu đẳng với Adobe Premiere
Nhấn vào đây để bắt đầu khóa học

Khóa dựng phần mềm quản lý dành cho nhà Quản lý và Kế toán bằng MS ACCESS
Nhấn vào đây để bắt đầu khóa học

Khóa học Machine Learning cơ bản-Khoa học dữ liệu - AI
Nhấn vào đây để bắt đầu khóa học

Khóa học Đào tạo sử dụng Excel Chuyên nghiệp & ứng dụng
Nhấn vào đây để bắt đầu khóa học

Khóa học sử dụng PowerPoint Chuyên nghiệp & ứng dụng
Nhấn vào đây để bắt đầu khóa học

Khóa học xây dựng và quản trị hệ thống đào tạo trực tuyến
Nhấn vào đây để bắt đầu khóa học

Đóng góp nội dung

Gửi ý kiến cho ban biên tập
Gửi thông tin

Thông tin

ĐĂNG KÝ/LIÊN HỆ: