Python回溯算法完整教程:TheAlgorithms/Python如何破解N皇后、数独与骑士巡游
【免费下载链接】PythonAll Algorithms implemented in Python项目地址: https://gitcode.com/GitHub_Trending/pyt/Python
本教程基于开源算法库 TheAlgorithms/Python(用 Python 实现全部经典算法),带你快速吃透Python 回溯算法:从最经典的 N 皇后问题,到数独求解器,再到骑士巡游(Knight Tour)。无需高深数学,跟着项目里的示例代码,几小时就能掌握回溯的三大核心步骤。🧩
回溯算法是什么:选择、判断、回退三步曲
回溯算法(Backtracking)是一种“试错 + 撤退”的搜索策略,专门用来解决组合爆炸类问题。它的思路可以浓缩为三步:
- 选择:在当前状态做一个候选决策(比如在第 3 行第 2 列放一枚皇后);
- 判断:用约束条件检查这个决策是否合法(是否与其他皇后互相攻击);
- 回退:如果走到底发现此路不通,就撤销刚才的选择,回到上一步尝试下一个候选。
💡 关键洞察:回溯通过剪枝(提前砍掉注定失败的分支)大幅缩小搜索空间,这也是项目文档 backtracking/README.md 中强调的核心思想——“在候选值不可能是解时将其剔除”。
快速开始:克隆仓库并运行第一个回溯程序
git clone https://gitcode.com/GitHub_Trending/pyt/Python cd Python python backtracking/n_queens.py运行后即可看到 8×8 棋盘上所有合法解,最后输出The total number of solutions are: 92——这正是 8 皇后的经典答案 ✅
Python 破解 N 皇后:最经典回溯案例
N 皇后问题 是回溯算法的“Hello World”:在 N×N 棋盘上放 N 枚棋子,使任意两枚不在同一行、列或对角线。
如何判断皇后位置安全(is_safe)
安全判断是整个算法的性能关键。is_safe 函数 只做三件事:
- 检查上方同一列是否已有皇后;
- 检查左上对角线是否已有皇后;
- 检查右上对角线是否已有皇后。
由于皇后逐行放置,只需要向上扫描,效率很高。
递归求解与撤销操作
核心逻辑在 solve 函数 中,体现了回溯标准范式:
if is_safe(board, row, i): board[row][i] = 1 # 选择 solve(board, row + 1) # 递归深入 board[row][i] = 0 # 回退:撤销选择,尝试下一列此外,项目还提供了一个纯数学思路的变体 n_queens_math.py:用“每行只放一枚皇后”的数组表示法(如[1, 3, 0, 2])替代二维棋盘,把冲突判断简化为数组比较,值得一读。
数独求解器:用回溯自动填数字
backtracking/sudoku.py 实现了一个完整的数独求解器。给定一个部分填充的 9×9 网格,它会自动补全所有空格,并保证每行、每列、每个 3×3 宫格内数字 1–9 不重复。
算法流程非常直观:
- find_empty_location 找到下一个空格;
- 依次尝试填入数字 1–9,由 is_safe 校验行、列、宫格约束;
- 递归求解;失败则抹掉这个数字,回溯到上一步。
关键的“回退”代码仅一行,却体现了回溯的灵魂:
if sudoku(grid) is not None: return grid grid[row][column] = 0 # 关键一步:撤销选择,尝试下一个数字项目还内置了一个无解的数独作为测试用例,程序会正确输出Cannot find a solution.——这也是回溯算法的重要能力:不仅能找解,还能证明“此路不通”。
骑士巡游:Knight Tour 的实现思路
骑士巡游要求马在国际象棋盘上每格恰好经过一次,是比 N 皇后规模更大的挑战。backtracking/knight_tour.py 的实现思路:
- get_valid_pos:列出马在当前格的 8 个合法落点(排除越界位置);
- open_knight_tour_helper:每走一步就标记格子,走满全盘即成功;否则把当前格置 0 并回溯换路;
- open_knight_tour:依次尝试每个起点,找不到解时抛出
ValueError(例如 2×2 棋盘无解)。
♞ 小提示:回溯能解骑士巡游,但大棋盘上会很慢;工程实践中可配合** Warnsdorff 启发式**(优先走向出路少的格子)加速——这是很好的进阶研究方向。
项目中的更多回溯算法清单
backtracking/目录还有十余个经典案例,覆盖面试高频题型:
| 算法 | 文件 | 说明 |
|---|---|---|
| 老鼠走迷宫 | rat_in_maze.py | 在 0/1 矩阵中找从起点到终点的路径 |
| 单词搜索 | word_search.py | 在字符网格中按相邻规则拼出目标单词 |
| 地图填色 | coloring.py | 图 m 色问题:相邻顶点不同色 |
| 组合枚举 | all_combinations.py | 回溯生成所有子集的经典训练题 |
学习路径建议:新手如何吃透回溯算法
- 先跑起来:依次运行 N 皇后 → 数独 → 骑士巡游,观察输出建立直觉;
- 再改一改:把 N 皇后中的
n = 8改成 4、6,验证解的个数变化; - 画搜索树:手动模拟 4×4 棋盘的递归过程,标记每次“选择/回退”的位置;
- 做对比:对比 n_queens.py 的二维棋盘法与 n_queens_math.py 的一维数组法,体会状态表示对代码简洁度的影响。
回溯算法是连接“暴力枚举”与“高效搜索”的桥梁,也是动态规划、剪枝优化等进阶话题的基石。以 TheAlgorithms/Python 的 backtracking 目录 为蓝本,一个文件一个案例地刷下来,你就能把“试错 + 回退”这套思路内化为解决组合问题的通用武器。🚀
【免费下载链接】PythonAll Algorithms implemented in Python项目地址: https://gitcode.com/GitHub_Trending/pyt/Python
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考