回溯算法通过逐行放置皇后并检查列与对角线冲突,递归尝试每列位置,若无法继续则回退重试,最终找到N皇后问题的所有解。

回溯算法是解决N皇后问题的经典方法。核心思想是:逐行放置皇后,每放一个检查是否与之前放置的皇后冲突,若冲突则回退(回溯),尝试下一个位置。通过递归实现状态的深入与回退,直到找到所有可行解。
问题分析与约束条件
N皇后问题要求在N×N棋盘上放置N个皇后,使得任意两个皇后不能在同一行、同一列或同一对角线上。
判断冲突的关键逻辑如下:
- 不在同一列:记录已放置皇后的列位置,新皇后不能放在这些列。
- 不在同一斜线:两个皇后(i, j)和(k, l)在同一斜线当且仅当 |i - k| == |j - l|。
递归结构与回溯过程
使用递归函数按行尝试放置皇后。每一层递归代表处理第row行,从第0行开始,直到第N-1行完成放置。
立即学习“C++免费学习笔记(深入)”;
基本流程:
- 从第0列到第N-1列依次尝试放置皇后。
- 对每个位置,调用检查函数判断是否安全。
- 若安全,则标记该位置,进入下一行递归。
- 若后续无法完成合法放置,则撤销当前选择(回溯),尝试下一列。
C++代码实现
// 判断当前位置 (row, col) 是否安全 bool isSafe(vectorfor (int col = 0; col < n; col++) {
if (isSafe(queens, row, col)) {
queens[row] = col; // 放置皇后
solveNQueens(result, queens, row + 1, n); // 进入下一行
// 不需要显式撤销,因为queens数组通过索引覆盖
}
}}
// 主函数:返回所有解
vector
使用示例与输出说明
调用 solveNQueens(4) 将返回所有4皇后问题的合法布局。每个解是一个二维字符串数组,其中'Q'表示皇后,'.'表示空格。
例如,一个可能的输出为:
[ [".Q..", "...Q", "Q...", "..Q."],["..Q.", "Q...", "...Q", ".Q.."] ]
表示4×4棋盘上的两种有效解法。
基本上就这些。回溯的本质是“试错+递归+恢复”,关键在于设计好状态表示和剪枝条件。N皇后中使用一维数组记录列位置,避免了重复检查整行整列,效率更高。










