回溯算法是解决N皇后问题最经典的方法,核心为“试错+撤回”,用三个布尔数组O(1)判断冲突,按行递归并用一维数组记录解,终止条件为row==n。

回溯算法是解决 N 皇后问题最经典且实用的方法。核心在于“试错+撤回”:逐行放置皇后,每放一个就检查是否与已放的冲突;一旦某行所有列都冲突,就回退到上一行换位置重试。
理解约束条件,提前剪枝
N 皇后要求任意两个皇后不能同行、同列或同对角线。实际编码中,不需要每次遍历所有已放皇后去判断——用三个布尔数组分别记录:
- cols[j]:第 j 列是否已被占用
- diag1[i - j + n - 1]:主对角线(左上→右下),索引统一偏移避免负数
- diag2[i + j]:副对角线(右上→左下),天然非负
这样每次尝试 (i, j) 时,只需 O(1) 时间判断能否放置,大幅减少无效递归。
按行递归,状态只存必要信息
由于每行只能放一个皇后,递归深度就是行号 i(从 0 到 n-1)。每层只枚举当前行的合法列位置,无需维护完整棋盘二维数组——用一维数组 queens[i] = j 记录第 i 行皇后所在列即可。最终构造解时再转成字符串列表。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
立即学习“Java免费学习笔记(深入)”;
避免重复计算,合理设计回溯入口
典型写法是定义 backtrack(int row) 方法:
- 递归终止:row == n,说明已成功放置 n 个皇后,保存当前解
- 当前层逻辑:遍历 0 到 n-1 列,对每个 j 检查 cols[j]、diag1[row−j+n−1]、diag2[row+j] 是否都为 false
- 若可放:标记对应位置为 true,设置 queens[row] = j,递归下一行;返回后取消标记(回溯)
优化输出与调试技巧
练习时建议先打印解的数量验证正确性(如 n=4 得 2 解,n=8 得 92 解);再扩展为返回所有解。调试可加简单日志,例如在进入 backtrack 前打印当前 row 和已占列集合,快速定位卡点。注意 Java 中 boolean 数组默认 false,初始化简洁;偏移量 n−1 是主对角线索引的关键,别写成 n 或 n+1。

















