python 数独生成
时间: 2023-10-14 16:29:52 浏览: 79
以下是一个简单的 Python 数独生成器,它使用递归算法生成一个有解的数独谜题:
```python
import random
def generate_board():
# 创建一个 9x9 的数独棋盘
board = [[0 for i in range(9)] for j in range(9)]
# 递归填充数字
fill_board(board)
# 随机移除部分数字
remove_numbers(board)
return board
def fill_board(board):
# 获取第一个空格的位置
row, col = get_next_empty_cell(board)
# 如果没有空格,则数独已经填好并且有解
if row == -1:
return True
# 从 1 到 9 随机选择一个数字
for num in random.sample(range(1, 10), 9):
# 检查数字是否可以放入当前空格
if is_valid(board, row, col, num):
# 如果可以,将数字填入当前空格
board[row][col] = num
# 递归填充下一个空格
if fill_board(board):
return True
# 如果下一个空格无法填入数字,则回溯并尝试下一个数字
board[row][col] = 0
# 如果所有数字都无法填入当前空格,则数独无解
return False
def get_next_empty_cell(board):
# 找到下一个空格的位置
for i in range(9):
for j in range(9):
if board[i][j] == 0:
return i, j
# 如果没有空格,则返回 (-1, -1)
return -1, -1
def is_valid(board, row, col, num):
# 检查行和列是否有重复数字
for i in range(9):
if board[row][i] == num or board[i][col] == num:
return False
# 检查 3x3 的子区域是否有重复数字
sub_row = (row // 3) * 3
sub_col = (col // 3) * 3
for i in range(3):
for j in range(3):
if board[sub_row+i][sub_col+j] == num:
return False
# 如果没有重复数字,则该数字可以放入当前位置
return True
def remove_numbers(board):
# 随机移除一些数字,直到达到所需的空格数
num_empty = random.randint(40, 60)
for i in range(num_empty):
row, col = random.randint(0, 8), random.randint(0, 8)
while board[row][col] == 0:
row, col = random.randint(0, 8), random.randint(0, 8)
board[row][col] = 0
```
你可以使用以下代码生成一个数独谜题:
```python
board = generate_board()
for row in board:
print(row)
```
输出结果将类似于:
```
[6, 4, 0, 0, 0, 0, 5, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 9]
[0, 0, 0, 0, 0, 0, 0, 2, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 2]
[0, 0, 0, 0, 0, 0, 0, 0, 8]
[0, 0, 0, 0, 0, 0, 0, 0, 6]
[4, 0, 0, 0, 0, 5, 9, 0, 0]
[0, 0, 0, 0, 0, 7, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0]
```
每个空格为 0 表示该位置为空,需要填入一个数字。