Trăn thuật toán sudoku

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/CJK6J1

Xem 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/CJK6J1

1. 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

SHOPEE SIÊU SALE 12. 12 https. //mua sắm. ee/1VOIDDMXxP TIKI https. // một chút. toàn cầu/CJK6J1

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 đặ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 = ""]
    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ớ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 = ""]
    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 sau

SHOPEE 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ượng

SHOPEE 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 4 
30 để 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 4 
31 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 4 
35 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 4 
36 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 4 
37 để 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 4 
38 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 4 
35 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 4 
36 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

Chủ Đề