首页 > 后端开发 > C++ > 正文

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

下次还敢
发布: 2025-11-25 12:25:48
原创
275人浏览过
回溯算法通过逐行放置皇后并检查列与对角线冲突,递归尝试每列位置,若无法继续则回退重试,最终找到N皇后问题的所有解。

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

回溯算法是解决N皇后问题的经典方法。核心思想是:逐行放置皇后,每放一个检查是否与之前放置的皇后冲突,若冲突则回退(回溯),尝试下一个位置。通过递归实现状态的深入与回退,直到找到所有可行解。

问题分析与约束条件

N皇后问题要求在N×N棋盘上放置N个皇后,使得任意两个皇后不能在同一行、同一列或同一对角线上。

判断冲突的关键逻辑如下:

  • 不在同一列:记录已放置皇后的列位置,新皇后不能放在这些列。
  • 不在同一斜线:两个皇后(i, j)和(k, l)在同一斜线当且仅当 |i - k| == |j - l|。

递归结构与回溯过程

使用递归函数按行尝试放置皇后。每一层递归代表处理第row行,从第0行开始,直到第N-1行完成放置。

立即学习C++免费学习笔记(深入)”;

基本流程:

听脑AI
听脑AI

听脑AI语音,一款专注于音视频内容的工作学习助手,为用户提供便捷的音视频内容记录、整理与分析功能。

听脑AI 745
查看详情 听脑AI
  • 从第0列到第N-1列依次尝试放置皇后。
  • 对每个位置,调用检查函数判断是否安全。
  • 若安全,则标记该位置,进入下一行递归。
  • 若后续无法完成合法放置,则撤销当前选择(回溯),尝试下一列。

C++代码实现

// 判断当前位置 (row, col) 是否安全 bool isSafe(vector& queens, int row, int col) { for (int i = 0; i // 递归求解N皇后问题 void solveNQueens(vector<vector>& result, vector& queens, int row, int n) { if (row == n) { // 所有行都已放置 vector board; for (int i = 0; i < n; i++) { string line(n, '.'); line[queens[i]] = 'Q'; board.push_back(line); } result.push_back(board); return; }
for (int col = 0; col < n; col++) {
    if (isSafe(queens, row, col)) {
        queens[row] = col;          // 放置皇后
        solveNQueens(result, queens, row + 1, n);  // 进入下一行
        // 不需要显式撤销,因为queens数组通过索引覆盖
    }
}
登录后复制

}

// 主函数:返回所有解 vector<vector> solveNQueens(int n) { vector<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++算法思想与递归实现的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号