Python回溯算法完整教程:TheAlgorithms/Python如何破解N皇后、数独与骑士巡游
2026/9/3 10:20:41 网站建设 项目流程

Python回溯算法完整教程:TheAlgorithms/Python如何破解N皇后、数独与骑士巡游

【免费下载链接】PythonAll Algorithms implemented in Python项目地址: https://gitcode.com/GitHub_Trending/pyt/Python

本教程基于开源算法库 TheAlgorithms/Python(用 Python 实现全部经典算法),带你快速吃透Python 回溯算法:从最经典的 N 皇后问题,到数独求解器,再到骑士巡游(Knight Tour)。无需高深数学,跟着项目里的示例代码,几小时就能掌握回溯的三大核心步骤。🧩

回溯算法是什么:选择、判断、回退三步曲

回溯算法(Backtracking)是一种“试错 + 撤退”的搜索策略,专门用来解决组合爆炸类问题。它的思路可以浓缩为三步:

  1. 选择:在当前状态做一个候选决策(比如在第 3 行第 2 列放一枚皇后);
  2. 判断:用约束条件检查这个决策是否合法(是否与其他皇后互相攻击);
  3. 回退:如果走到底发现此路不通,就撤销刚才的选择,回到上一步尝试下一个候选。

💡 关键洞察:回溯通过剪枝(提前砍掉注定失败的分支)大幅缩小搜索空间,这也是项目文档 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 不重复。

算法流程非常直观:

  1. find_empty_location 找到下一个空格;
  2. 依次尝试填入数字 1–9,由 is_safe 校验行、列、宫格约束;
  3. 递归求解;失败则抹掉这个数字,回溯到上一步。

关键的“回退”代码仅一行,却体现了回溯的灵魂:

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回溯生成所有子集的经典训练题

学习路径建议:新手如何吃透回溯算法

  1. 先跑起来:依次运行 N 皇后 → 数独 → 骑士巡游,观察输出建立直觉;
  2. 再改一改:把 N 皇后中的n = 8改成 4、6,验证解的个数变化;
  3. 画搜索树:手动模拟 4×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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询