Hãy xây dựng một bộ giải sudoku bằng Python ngay hôm nay. Sudoku Puzzle là một câu đố rất phổ biến xuất hiện trên các tờ báo hàng ngày thu hút sự quan tâm của rất nhiều người. Có rất nhiều bài toán khó, chưa có lời giải về câu đố sudoku và cách khái quát hóa của chúng khiến câu đố này trở nên thú vị, đặc biệt đối với nhiều người yêu thích toán học
Câu đố Sudoku là gì?
Trong câu đố Sudoku, chúng ta cần điền vào mỗi ô trống một số nguyên từ 1 đến 9 sao cho mỗi số từ 1 đến 9 xuất hiện một lần ở mỗi hàng, mỗi cột và mỗi ô nhỏ trong 3 nhân 3 hộp được đánh dấu bằng đường viền dày
Độ khó của câu đố này có thể thay đổi. Mức độ khó của các câu đố Sudoku càng cao thì vấn đề nghiên cứu càng trở nên thách thức đối với các nhà khoa học máy tính. Các câu đố khó hầu hết có ít biểu tượng quy định hơn
Các câu đố Sudoku được xuất bản để giải trí có các giải pháp độc đáo. Một câu đố Sudoku được cho là đúng nếu nó có một giải pháp duy nhất. Một vấn đề nghiên cứu đầy thách thức khác là xác định cần điền bao nhiêu ô để câu đố Sudoku được hình thành tốt. Sudoku được hình thành tốt với 17 biểu tượng tồn tại. Không biết liệu có tồn tại một câu đố được hình thành tốt chỉ với 16 manh mối hay không. Càng ít manh mối, cơ hội có nhiều giải pháp càng cao
Các bước để giải Câu đố Sudoku bằng Python
- Trong phương pháp giải câu đố sudoku này, đầu tiên, chúng ta gán kích thước của ma trận 2D cho một biến M [M*M]
- Sau đó, chúng tôi gán chức năng tiện ích [câu đố] để in lưới
- Sau đó, nó sẽ gán num cho hàng và col
- Nếu chúng tôi tìm thấy cùng một số trong cùng một hàng hoặc cùng một cột hoặc trong ma trận 3*3 cụ thể, 'false' sẽ được trả về
- Sau đó, chúng tôi sẽ kiểm tra xem chúng tôi đã đến hàng thứ 8 và cột thứ 9 chưa và trả về giá trị true để dừng quay lui thêm
- Tiếp theo chúng ta sẽ kiểm tra nếu giá trị cột trở thành 9 thì chúng ta chuyển sang hàng và cột tiếp theo
- Hơn nữa, bây giờ chúng ta xem vị trí hiện tại của lưới có giá trị lớn hơn 0 hay không, sau đó chúng ta lặp lại cho cột tiếp theo
- Sau khi kiểm tra xem có an toàn hay không, chúng ta chuyển sang cột tiếp theo rồi gán số ở vị trí [hàng, cột] hiện tại của lưới. Sau đó, chúng tôi kiểm tra khả năng tiếp theo với cột tiếp theo
- Vì giả định của chúng tôi là sai, chúng tôi loại bỏ số được chỉ định và sau đó chúng tôi chuyển sang giả định tiếp theo với một giá trị số khác
Triển khai Trình giải Sudoku trong Python
Chúng tôi sẽ sử dụng phương pháp quay lui để tạo trình giải sudoku của chúng tôi trong Python. Quay lui có nghĩa là quay lại bước trước đó ngay khi chúng tôi xác định rằng giải pháp hiện tại của chúng tôi không thể tiếp tục thành một giải pháp hoàn chỉnh. Chúng tôi sử dụng nguyên tắc quay lui này để thực hiện thuật toán sudoku. Nó còn được gọi là cách thuật toán brute force để giải câu đố sudoku
M = 9 def puzzle[a]: for i in range[M]: for j in range[M]: print[a[i][j],end = " "] print[] def solve[grid, row, col, num]: for x in range[9]: if grid[row][x] == num: return False for x in range[9]: if grid[x][col] == num: return False startRow = row - row % 3 startCol = col - col % 3 for i in range[3]: for j in range[3]: if grid[i + startRow][j + startCol] == num: return False return True def Suduko[grid, row, col]: if [row == M - 1 and col == M]: return True if col == M: row += 1 col = 0 if grid[row][col] > 0: return Suduko[grid, row, col + 1] for num in range[1, M + 1, 1]: if solve[grid, row, col, num]: grid[row][col] = num if Suduko[grid, row, col + 1]: return True grid[row][col] = 0 return False '''0 means the cells where no value is assigned''' grid = [[2, 5, 0, 0, 3, 0, 9, 0, 1], [0, 1, 0, 0, 0, 4, 0, 0, 0], [4, 0, 7, 0, 0, 0, 2, 0, 8], [0, 0, 5, 2, 0, 0, 0, 0, 0], [0, 0, 0, 0, 9, 8, 1, 0, 0], [0, 4, 0, 0, 0, 3, 0, 0, 0], [0, 0, 0, 3, 6, 0, 0, 7, 2], [0, 7, 0, 0, 0, 0, 0, 0, 3], [9, 0, 3, 0, 0, 0, 6, 0, 4]] if [Suduko[grid, 0, 0]]: puzzle[grid] else: print["Solution does not exist:["]
đầu ra
====================== RESTART: C:/Users/SIDDHI/sudoku.py =========== 2 5 8 7 3 6 9 4 1 6 1 9 8 2 4 3 5 7 4 3 7 9 1 5 2 6 8 3 9 5 2 7 1 4 8 6 7 6 2 4 9 8 1 3 5 8 4 1 6 5 3 7 2 9 1 8 4 3 6 9 5 7 2 5 7 6 1 4 2 8 9 3 9 2 3 5 8 7 6 1 4
Sự kết luận
Đó là tất cả để xây dựng bộ giải sudoku trong Python. Tôi hy vọng bạn đã vui vẻ khi đọc qua bài viết và tìm hiểu cách chúng tôi triển khai mã
Psst.. cũng có một cách dễ dàng hơn để xây dựng bộ giải sudoku trong Python
Bạn có thể nhập sudoku py-sudoku. Mô-đun PyPI từ https. //pipi. tổ chức/dự án/py-sudoku/. Đây là một chương trình Python đơn giản tạo và giải các câu đố Sudoku m x n
Trong bài học này, chúng ta sẽ sử dụng thuật toán quay lui để giải câu đố Sudoku. Để hiểu cách sử dụng quay lui có hại gì các bạn xem bài Thuết oất quay lui và minh hui
SHOPEE SIÊU SALE 12. 12 https. //mua sắm. ee/1VOIDDMXxP TIKI https. // một chút. toàn cầu/CJK6J1Xem thêm. con trăn. Hộp tiến trình hộp số hợp nhất quy định
Tham khảo từ techwithtim. mạng lưới
SHOPEE SIÊU SALE 12. 12 https. //mua sắm. ee/1VOIDDMXxP TIKI https. // một chút. toàn cầu/CJK6J11. Giới thiệu luật chơi Sudoku và cách giải
Sudoku là trò chơi đến định dạng wiki định dạng sau
trò chơi sudoku. Mục tiêu của trò chơi là điền các chữ cái vào ô 9×9 sao cho mỗi cột, mỗi hàng, mỗi phần của 9 ô có cấu trúc 3×3 tạo thành ô chính [còn gọi là “hộp”, “khối ”, hoặc “vùng”] chứa tất cả các ký tự từ 1 đến 9. Câu đố đã hoàn thành một phần, game thủ phải giải lại bằng cách điền số. Mỗi câu đố được thiết lập tốt chỉ với một điều
SHOPEE SIÊU SALE 12. 12 https. //mua sắm. ee/1VOIDDMXxP TIKI https. // một chút. toàn cầu/CJK6J1
Để giải trò chơi Sudoku, vui lòng xem video hướng dẫn của chúng tôi
2. Thuật toán giải Sudoku
Nên ở đây chúng ta sẽ sử dụng thuật toán giải Sudoku bằng kỹ thuật quay lui, sử dụng ngôn ngữ Python. Các bước thực hiện như sau
- Tìm hiểu trong câu đố Sudoku
- Tìm ba khoảng trống trong Sudoku
- Đối với mỗi ô trống trong số ba ô trống bạn vừa tìm được, hãy thử đặt
def in_sudoku[q]: for d in range[len[q]]: if d % 3 == 0 and d != 0: print["- - - - - - - - - - -"] for c in range[len[q[0]]]: if c % 3 == 0 and c != 0: print["| ", end =""] if c == 8: print[str[q[d][c]]] else: print[str[q[d][c]] + " ", end = ""]
6từ 1 đến 9 vào ô trống đó. Kiểm tra những gì bạn đang cố gắng đặtdef in_sudoku[q]: for d in range[len[q]]: if d % 3 == 0 and d != 0: print["- - - - - - - - - - -"] for c in range[len[q[0]]]: if c % 3 == 0 and c != 0: print["| ", end =""] if c == 8: print[str[q[d][c]]] else: print[str[q[d][c]] + " ", end = ""]
6 vào chỗ trống [nếu bạn không đáp ứng các yêu cầu của luật chơi Sudoku]. Nếu bạn có tùy chọn, hãy tiếp tục chọn ô trống bên cạnh và nếu không, hãy thử lại vớidef in_sudoku[q]: for d in range[len[q]]: if d % 3 == 0 and d != 0: print["- - - - - - - - - - -"] for c in range[len[q[0]]]: if c % 3 == 0 and c != 0: print["| ", end =""] if c == 8: print[str[q[d][c]]] else: print[str[q[d][c]] + " ", end = ""]
8 - Lặp lại quy trèn cho đến khi không hiển thị ô bạn nào trên câu hoặc không tìm thấy cầu trượt
Đầu vào, một câu đố sudoku được đại diện bởi danh sách
def in_sudoku[q]: for d in range[len[q]]: if d % 3 == 0 and d != 0: print["- - - - - - - - - - -"] for c in range[len[q[0]]]: if c % 3 == 0 and c != 0: print["| ", end =""] if c == 8: print[str[q[d][c]]] else: print[str[q[d][c]] + " ", end = ""]9 2 dụ [một danh sách gồm 9 phần, mỗi phần là lạn – lại là một danh sách gồm 9 phần tương ứng với 9 ô trong một lộn] với ô trống được điền bởi số
def in_sudoku[q]: for d in range[len[q]]: if d % 3 == 0 and d != 0: print["- - - - - - - - - - -"] for c in range[len[q[0]]]: if c % 3 == 0 and c != 0: print["| ", end =""] if c == 8: print[str[q[d][c]]] else: print[str[q[d][c]] + " ", end = ""]0, ví dụ Sudoku
def in_sudoku[q]: for d in range[len[q]]: if d % 3 == 0 and d != 0: print["- - - - - - - - - - -"] for c in range[len[q[0]]]: if c % 3 == 0 and c != 0: print["| ", end =""] if c == 8: print[str[q[d][c]]] else: print[str[q[d][c]] + " ", end = ""]1 được biểu diễn dưới dạng sauSHOPEE SIÊU SALE 12. 12 https. //mua sắm. ee/1VOIDDMXxP TIKI https. // một chút. toàn cầu/CJK6J1____4
Lưu ý rằng số
def in_sudoku[q]: for d in range[len[q]]: if d % 3 == 0 and d != 0: print["- - - - - - - - - - -"] for c in range[len[q[0]]]: if c % 3 == 0 and c != 0: print["| ", end =""] if c == 8: print[str[q[d][c]]] else: print[str[q[d][c]] + " ", end = ""]2 trong Python được viết từ
def in_sudoku[q]: for d in range[len[q]]: if d % 3 == 0 and d != 0: print["- - - - - - - - - - -"] for c in range[len[q[0]]]: if c % 3 == 0 and c != 0: print["| ", end =""] if c == 8: print[str[q[d][c]]] else: print[str[q[d][c]] + " ", end = ""]0 trở đi, vì vậy ba vị trí của mỗi số trong bảng sẽ là
def in_sudoku[q]: for d in range[len[q]]: if d % 3 == 0 and d != 0: print["- - - - - - - - - - -"] for c in range[len[q[0]]]: if c % 3 == 0 and c != 0: print["| ", end =""] if c == 8: print[str[q[d][c]]] else: print[str[q[d][c]] + " ", end = ""]4 đến
def in_sudoku[q]: for d in range[len[q]]: if d % 3 == 0 and d != 0: print["- - - - - - - - - - -"] for c in range[len[q[0]]]: if c % 3 == 0 and c != 0: print["| ", end =""] if c == 8: print[str[q[d][c]]] else: print[str[q[d][c]] + " ", end = ""]5, ở đây
def in_sudoku[q]: for d in range[len[q]]: if d % 3 == 0 and d != 0: print["- - - - - - - - - - -"] for c in range[len[q[0]]]: if c % 3 == 0 and c != 0: print["| ", end =""] if c == 8: print[str[q[d][c]]] else: print[str[q[d][c]] + " ", end = ""]6 là số ở dòng thứ ba
def in_sudoku[q]: for d in range[len[q]]: if d % 3 == 0 and d != 0: print["- - - - - - - - - - -"] for c in range[len[q[0]]]: if c % 3 == 0 and c != 0: print["| ", end =""] if c == 8: print[str[q[d][c]]] else: print[str[q[d][c]] + " ", end = ""]7 và cột
def in_sudoku[q]: for d in range[len[q]]: if d % 3 == 0 and d != 0: print["- - - - - - - - - - -"] for c in range[len[q[0]]]: if c % 3 == 0 and c != 0: print["| ", end =""] if c == 8: print[str[q[d][c]]] else: print[str[q[d][c]] + " ", end = ""]8
2. 1. Tìm hiểu trong câu đố Sudoku
Ở đây chúng ta sử dụng giao diện dòng lệnh, chưa sử dụng giao diện GUI nên chúng ta sẽ sử dụng hàm
def in_sudoku[q]: for d in range[len[q]]: if d % 3 == 0 and d != 0: print["- - - - - - - - - - -"] for c in range[len[q[0]]]: if c % 3 == 0 and c != 0: print["| ", end =""] if c == 8: print[str[q[d][c]]] else: print[str[q[d][c]] + " ", end = ""]9 của Python để hiển thị màn hình CMD trong một đối tượngSHOPEE SIÊU SALE 12. 12 https. //mua sắm. ee/1VOIDDMXxP TIKI https. // một chút. toàn cầu/CJK6J1
Nó sẽ viết hàm
====================== RESTART: C:/Users/SIDDHI/sudoku.py =========== 2 5 8 7 3 6 9 4 1 6 1 9 8 2 4 3 5 7 4 3 7 9 1 5 2 6 8 3 9 5 2 7 1 4 8 6 7 6 2 4 9 8 1 3 5 8 4 1 6 5 3 7 2 9 1 8 4 3 6 9 5 7 2 5 7 6 1 4 2 8 9 3 9 2 3 5 8 7 6 1 430 để trong câu đố Sudoku có tên
====================== RESTART: C:/Users/SIDDHI/sudoku.py =========== 2 5 8 7 3 6 9 4 1 6 1 9 8 2 4 3 5 7 4 3 7 9 1 5 2 6 8 3 9 5 2 7 1 4 8 6 7 6 2 4 9 8 1 3 5 8 4 1 6 5 3 7 2 9 1 8 4 3 6 9 5 7 2 5 7 6 1 4 2 8 9 3 9 2 3 5 8 7 6 1 431 trên màn hình, sử dụng các biến
def in_sudoku[q]: for d in range[len[q]]: if d % 3 == 0 and d != 0: print["- - - - - - - - - - -"] for c in range[len[q[0]]]: if c % 3 == 0 and c != 0: print["| ", end =""] if c == 8: print[str[q[d][c]]] else: print[str[q[d][c]] + " ", end = ""]7 và
def in_sudoku[q]: for d in range[len[q]]: if d % 3 == 0 and d != 0: print["- - - - - - - - - - -"] for c in range[len[q[0]]]: if c % 3 == 0 and c != 0: print["| ", end =""] if c == 8: print[str[q[d][c]]] else: print[str[q[d][c]] + " ", end = ""]8 để biểu diễn các hàng và cột
Nếu dòng
def in_sudoku[q]: for d in range[len[q]]: if d % 3 == 0 and d != 0: print["- - - - - - - - - - -"] for c in range[len[q[0]]]: if c % 3 == 0 and c != 0: print["| ", end =""] if c == 8: print[str[q[d][c]]] else: print[str[q[d][c]] + " ", end = ""]7 là dòng thứ hai của
====================== RESTART: C:/Users/SIDDHI/sudoku.py =========== 2 5 8 7 3 6 9 4 1 6 1 9 8 2 4 3 5 7 4 3 7 9 1 5 2 6 8 3 9 5 2 7 1 4 8 6 7 6 2 4 9 8 1 3 5 8 4 1 6 5 3 7 2 9 1 8 4 3 6 9 5 7 2 5 7 6 1 4 2 8 9 3 9 2 3 5 8 7 6 1 435 hoặc
====================== RESTART: C:/Users/SIDDHI/sudoku.py =========== 2 5 8 7 3 6 9 4 1 6 1 9 8 2 4 3 5 7 4 3 7 9 1 5 2 6 8 3 9 5 2 7 1 4 8 6 7 6 2 4 9 8 1 3 5 8 4 1 6 5 3 7 2 9 1 8 4 3 6 9 5 7 2 5 7 6 1 4 2 8 9 3 9 2 3 5 8 7 6 1 436 thì trên màn hình sẽ hiển thị một dòng gồm các từ
====================== RESTART: C:/Users/SIDDHI/sudoku.py =========== 2 5 8 7 3 6 9 4 1 6 1 9 8 2 4 3 5 7 4 3 7 9 1 5 2 6 8 3 9 5 2 7 1 4 8 6 7 6 2 4 9 8 1 3 5 8 4 1 6 5 3 7 2 9 1 8 4 3 6 9 5 7 2 5 7 6 1 4 2 8 9 3 9 2 3 5 8 7 6 1 437 để phân tách chúng ra, mục đích là để biểu diễn các khối vuông
====================== RESTART: C:/Users/SIDDHI/sudoku.py =========== 2 5 8 7 3 6 9 4 1 6 1 9 8 2 4 3 5 7 4 3 7 9 1 5 2 6 8 3 9 5 2 7 1 4 8 6 7 6 2 4 9 8 1 3 5 8 4 1 6 5 3 7 2 9 1 8 4 3 6 9 5 7 2 5 7 6 1 4 2 8 9 3 9 2 3 5 8 7 6 1 438 của Sudoku. Tương tự nếu cột ở vị trí
====================== RESTART: C:/Users/SIDDHI/sudoku.py =========== 2 5 8 7 3 6 9 4 1 6 1 9 8 2 4 3 5 7 4 3 7 9 1 5 2 6 8 3 9 5 2 7 1 4 8 6 7 6 2 4 9 8 1 3 5 8 4 1 6 5 3 7 2 9 1 8 4 3 6 9 5 7 2 5 7 6 1 4 2 8 9 3 9 2 3 5 8 7 6 1 435 hoặc
====================== RESTART: C:/Users/SIDDHI/sudoku.py =========== 2 5 8 7 3 6 9 4 1 6 1 9 8 2 4 3 5 7 4 3 7 9 1 5 2 6 8 3 9 5 2 7 1 4 8 6 7 6 2 4 9 8 1 3 5 8 4 1 6 5 3 7 2 9 1 8 4 3 6 9 5 7 2 5 7 6 1 4 2 8 9 3 9 2 3 5 8 7 6 1 436 thì sẽ ở ra kí tạm thời
def in_sudoku[q]: for d in range[len[q]]: if d % 3 == 0 and d != 0: print["- - - - - - - - - - -"] for c in range[len[q[0]]]: if c % 3 == 0 and c != 0: print["| ", end =""] if c == 8: print[str[q[d][c]]] else: print[str[q[d][c]] + " ", end = ""]41 để ngăn cách. Nếu cột ở hàng thứ ba
def in_sudoku[q]: for d in range[len[q]]: if d % 3 == 0 and d != 0: print["- - - - - - - - - - -"] for c in range[len[q[0]]]: if c % 3 == 0 and c != 0: print["| ", end =""] if c == 8: print[str[q[d][c]]] else: print[str[q[d][c]] + " ", end = ""]42 thì nó sẽ là dòng mới