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

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

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


🧩 一、题目描述

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

示例输入:

python 复制代码
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代码实现

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 False
            box_r, box_c = 3 * (r // 3) + i // 3, 3 * (c // 3) + i % 3
            if board[box_r][box_c] == ch:
                return False
        return True

    def 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] = ch
                            if dfs():
                                return True
                            board[i][j] = "."
                    return False
        return True

    dfs()

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

python 复制代码
solve_sudoku(board)
for row in board:
    print(" ".join(row))

🧩 五、关键点总结

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

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


💡 六、进阶挑战

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

❤️ 结语

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

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


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

相关推荐
2401_8747325312 小时前
为你的Python脚本添加图形界面(GUI)
jvm·数据库·python
FreakStudio12 小时前
0 元学嵌入式 GUI!保姆级 LVGL+MicroPython 教程开更,从理论到实战全搞定
python·单片机·嵌入式·面向对象·电子diy
剑穗挂着新流苏31214 小时前
117_PyTorch 实战:利用训练好的模型进行单张图片验证
人工智能·python·深度学习
Lethehong15 小时前
Python Selenium全栈指南:从自动化入门到企业级实战
python·selenium·测试工具·自动化
智算菩萨15 小时前
MP3音频编码原理深度解析与Python全参数调优实战:从心理声学模型到LAME编码器精细控制
android·python·音视频
qq_4523962316 小时前
【模型手术室】第四篇:全流程实战 —— 使用 LLaMA-Factory 开启你的第一个微调任务
人工智能·python·ai·llama
无心水16 小时前
Java时间处理封神篇:java.time全解析
java·开发语言·python·架构·localdate·java.time·java时间处理
吴秋霖17 小时前
【某音电商】protobuf聊天协议逆向
python·算法·protobuf
深藏功yu名17 小时前
Day24:向量数据库 Chroma_FAISS 入门
数据库·人工智能·python·ai·agent·faiss·chroma
cm65432017 小时前
用Python破解简单的替换密码
jvm·数据库·python