欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > Python小练习系列 Vol.5:数独求解(经典回溯 + 剪枝)

Python小练习系列 Vol.5:数独求解(经典回溯 + 剪枝)

2025/4/3 10:53:25 来源:https://blog.csdn.net/weixin_44789022/article/details/146689693  浏览:    关键词:Python小练习系列 Vol.5:数独求解(经典回溯 + 剪枝)

🧠 Python小练习系列 Vol.5:数独求解(经典回溯 + 剪枝)

🧩 数独不仅是益智游戏,更是回溯算法的典范!本期我们将用 DFS + 剪枝 的方式一步步求解一个标准 9x9 数独。


🧩 一、题目描述

给定一个部分填充的 9×9 数独棋盘,请编写一个程序将其填完,使每行、每列、每个 3×3 宫内的数字 1~9 均不重复。

示例输入:

board = [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]
]

🧠 二、解题思路

使用回溯 + 剪枝,依次尝试将数字 1~9 填入空格中,若不符合数独规则则回退重试。

核心逻辑:

  • 递归寻找空白格,尝试填入合法数字
  • 若数字在当前行、列或 3x3 宫格中已出现,则剪枝
  • 全部填满时即为解

👨‍💻 三、Python代码实现

def solve_sudoku(board):def is_valid(r, c, ch):for i in range(9):if board[r][i] == ch or board[i][c] == ch:return Falsebox_r, box_c = 3 * (r // 3) + i // 3, 3 * (c // 3) + i % 3if board[box_r][box_c] == ch:return Falsereturn Truedef dfs():for i in range(9):for j in range(9):if board[i][j] == ".":for ch in map(str, range(1, 10)):if is_valid(i, j, ch):board[i][j] = chif dfs():return Trueboard[i][j] = "."return Falsereturn Truedfs()

📌 四、输出示例(运行后 board 被原地修改)

solve_sudoku(board)
for row in board:print(" ".join(row))

🧩 五、关键点总结

步骤说明
查找空位使用双层循环寻找 .
合法判断检查当前行、列、宫格是否冲突
回溯回退无法填充时,重置该位置为 .

✅ 本题是典型的「排列填空 + 剪枝」模型


💡 六、进阶挑战

  • 🧠 输出所有可能解(需去掉第一个 return)
  • ⚡ 加速优化:用位运算预处理可选值
  • 🎨 制作 GUI 数独求解器(Tkinter/PyQt)

❤️ 结语

数独是一道优雅的全排列题目,透过回溯 + 剪枝,掌握“选择-尝试-回退”的算法核心!

📌 下一期预告:单词搜索(网格回溯)


👉 点个赞 👍 + 收藏 🌟,学透回溯,从数独开始!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词