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

回溯算法是解决 N 皇后问题最经典且实用的方法。核心在于“试错+撤回”:逐行放置皇后,每放一个就检查是否与已放的冲突;一旦某行所有列都冲突,就回退到上一行换位置重试。
理解约束条件,提前剪枝
N 皇后要求任意两个皇后不能同行、同列或同对角线。实际编码中,不需要每次遍历所有已放皇后去判断——用三个布尔数组分别记录:
- cols[j]:第 j 列是否已被占用
- diag1[i - j + n - 1]:主对角线(左上→右下),索引统一偏移避免负数
- diag2[i + j]:副对角线(右上→左下),天然非负
这样每次尝试 (i, j) 时,只需 O(1) 时间判断能否放置,大幅减少无效递归。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
按行递归,状态只存必要信息
由于每行只能放一个皇后,递归深度就是行号 i(从 0 到 n-1)。每层只枚举当前行的合法列位置,无需维护完整棋盘二维数组——用一维数组 queens[i] = j 记录第 i 行皇后所在列即可。最终构造解时再转成字符串列表。
避免重复计算,合理设计回溯入口
典型写法是定义 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。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










