-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsudo.py
More file actions
135 lines (110 loc) · 3.64 KB
/
sudo.py
File metadata and controls
135 lines (110 loc) · 3.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import random
def print_board(board):
for row in board:
print(row)
def is_valid(board, num, row, col):
for i in range(9):
if board[row][i] == num or board[i][col] == num:
return False
start_row, start_col = 3 * (row // 3), 3 * (col // 3)
for i in range(3):
for j in range(3):
if board[start_row + i][start_col + j] == num:
return False
return True
def solve_sudoku(board):
for row in range(9):
for col in range(9):
if board[row][col] == 0:
for num in range(1, 10):
if is_valid(board, num, row, col):
board[row][col] = num
if solve_sudoku(board):
return True
board[row][col] = 0
return False
return True
def generate_sudoku(difficulty):
board = [[0 for _ in range(9)] for _ in range(9)]
solve_sudoku(board)
if difficulty == '入门':
empty_cells = 30
elif difficulty == '专业':
empty_cells = 40
elif difficulty == '大师':
empty_cells = 50
elif difficulty == '巅峰':
empty_cells = 60
else:
print('错误的难度级别')
return None
cells = [(i, j) for i in range(9) for j in range(9)]
random.shuffle(cells)
for i in range(empty_cells):
row, col = cells[i]
board[row][col] = 0
return board
# 生成一个入门级别的数独题目
board = generate_sudoku('入门')
print_board(board)
def print_board(board):
for row in board:
print(row)
def is_valid(board, num, row, col):
for i in range(9):
if board[row][i] == num or board[i][col] == num:
return False
start_row, start_col = 3 * (row // 3), 3 * (col // 3)
for i in range(3):
for j in range(3):
if board[start_row + i][start_col + j] == num:
return False
return True
def solve_sudoku(board):
for row in range(9):
for col in range(9):
if board[row][col] == 0:
for num in range(1, 10):
if is_valid(board, num, row, col):
board[row][col] = num
if solve_sudoku(board):
return True
board[row][col] = 0
return False
return True
def generate_sudoku(difficulty):
board = [[0 for _ in range(9)] for _ in range(9)]
solve_sudoku(board)
# 根据难度级别确定要清空的格子数量
if difficulty == '入门':
empty_cells = 30
elif difficulty == '专业':
empty_cells = 40
elif difficulty == '大师':
empty_cells = 50
elif difficulty == '巅峰':
empty_cells = 60
else:
print('错误的难度级别')
return None
cells = [(i, j) for i in range(9) for j in range(9)]
random.shuffle(cells)
for i in range(empty_cells):
row, col = cells[i]
board[row][col] = 0
return board
# 生成一个大师级别的数独题目
board = generate_sudoku('大师')
while True:
print_board(board)
row = int(input("请输入要填入数字的行数(1-9): ")) - 1
col = int(input("请输入要填入数字的列数(1-9): ")) - 1
num = int(input("请输入要填入的数字(1-9): "))
if is_valid(board, num, row, col):
board[row][col] = num
else:
print("填入的数字与已有数字冲突,请重新输入。")
# 判断是否已经完全填入数字
if all(all(cell != 0 for cell in row) for row in board):
print("恭喜,数独题目已完成!")
break