C++怎么实现回溯算法解决N皇后问题_C++算法思想与递归实现

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

c++怎么实现回溯算法解决n皇后问题_c++算法思想与递归实现

回溯算法是解决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(vector& queens, int row, int col) { for (int i = 0; i // 递归求解N皇后问题void solveNQueens(vector>& result, vector& queens, int row, int n) {if (row == n) { // 所有行都已放置vector board;for (int i = 0; i

for (int col = 0; col < n; col++) {    if (isSafe(queens, row, col)) {        queens[row] = col;          // 放置皇后        solveNQueens(result, queens, row + 1, n);  // 进入下一行        // 不需要显式撤销,因为queens数组通过索引覆盖    }}

}

// 主函数:返回所有解vector> solveNQueens(int n) {vector> result;vector queens(n, -1); // 记录每行皇后所在的列solveNQueens(result, queens, 0, n);return result;}

使用示例与输出说明

调用 solveNQueens(4) 将返回所有4皇后问题的合法布局。每个解是一个二维字符串数组,其中’Q’表示皇后,’.’表示空格。

例如,一个可能的输出为:

[ [“.Q..”, “…Q”, “Q…”, “..Q.”],

[“..Q.”,”Q…”,”…Q”,”.Q..”]]

表示4×4棋盘上的两种有效解法。

基本上就这些。回溯的本质是“试错+递归+恢复”,关键在于设计好状态表示和剪枝条件。N皇后中使用一维数组记录列位置,避免了重复检查整行整列,效率更高。

以上就是C++怎么实现回溯算法解决N皇后问题_C++算法思想与递归实现的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1485994.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 09:25:03
下一篇 2025年12月19日 09:25:09

相关推荐

发表回复

登录后才能评论
关注微信