项目18:简易数独生成器 — 《跟着小王学Python·新手》
《跟着小王学Python》 是一套精心设计的Python学习教程,适合各个层次的学习者。本教程从基础语法入手,逐步深入到高级应用,以实例驱动的方式,帮助学习者逐步掌握Python的核心概念。通过开发游戏、构建Web应用、编写网络爬虫、制作桌面软件等多样化项目,学习者可以深入理解并实践Python知识。每周更新1至2篇内容,旨在助力学习者成长为全栈工程师。
文章目录
- 项目18:简易数独生成器 --- 《跟着小王学Python·新手》
- 目标
- 功能
- 设计
- 数独规则
- 算法设计
- 数据结构
- 实现步骤
- 代码实现
- 测试
- 注意事项
- 小结

目标
本项目旨在为Python新手提供一个简易数独生成器的实现教程。通过本教程,学习者将能够理解数独的规则,掌握基本的算法设计,并学会如何用Python编写一个简易的数独生成器。
功能
- 生成数独:生成一个9x9的数独棋盘,每个单元格随机填充数字1-9。
- 检查有效性:确保生成的数独是有效的,即每一行、每一列以及每个3x3的小宫格中数字1-9都只出现一次。
设计
数独规则
数独是一个9x9的网格,被划分为9个3x3的小宫格。玩家需要在空格中填入数字1-9,使得每一行、每一列以及每个小宫格中的数字都不重复。
算法设计
- 初始化棋盘:创建一个9x9的二维数组,用于存储数独的数字。
- 随机填充数字:随机选择一个空格,并尝试填入1-9中的一个数字。
- 检查规则:检查填入的数字是否违反数独规则,如果违反则撤销操作。
- 递归填充:重复步骤2和3,直到棋盘填满或无法继续填充。
数据结构
- 使用二维数组
board[9][9]来表示数独棋盘。
实现步骤
- 初始化一个9x9的棋盘。
- 定义一个函数
is_valid(board, row, col, num)来检查在特定位置放置特定数字是否有效。 - 定义一个函数
solve_sudoku(board)来递归填充棋盘。 - 调用
solve_sudoku函数生成数独。
代码实现
import random
def is_valid(board, row, col, num):
# 检查行
for x in range(9):
if board[row][x] == num:
return False
# 检查列
for x in range(9):
if board[x][col] == num:
return False
# 检查3x3宫格
start_row, start_col = 3 * (row // 3), 3 * (col // 3)
for i in range(3):
for j in range(3):
if board[i + start_row][j + start_col] == num:
return False
return True
def solve_sudoku(board):
empty = find_empty_location(board)
if not empty:
return True # 棋盘已填满
row, col = empty
for num in range(1, 10):
if is_valid(board, row, col, num):
board[row][col] = num
if solve_sudoku(board):
return True
board[row][col] = 0 # 回溯
return False
def find_empty_location(board):
for i in range(9):
for j in range(9):
if board[i][j] == 0:
return (i, j) # 返回空格的位置
return None
# 初始化棋盘
board = [[0 for _ in range(9)] for _ in range(9)]
# 生成数独
if solve_sudoku(board):
for row in board:
print(row)
else:
print("No solution exists")测试
- 运行上述代码,检查输出的数独是否有效。
- 尝试修改
solve_sudoku函数的逻辑,观察输出的变化。
注意事项
- 确保在调用
solve_sudoku函数之前,棋盘已正确初始化。 - 在实际应用中,可能需要更复杂的算法来生成更有趣的数独,例如考虑难度等级。
小结
通过本项目,我们学习了数独的规则和基本的算法设计。我们通过递归回溯算法实现了一个简易的数独生成器。希望这个项目能够帮助新手理解算法的基本概念,并激发对编程的兴趣。
















