N-皇后问题的回溯算法实现
创作时间:
作者:
@小白创作中心
N-皇后问题的回溯算法实现
引用
CSDN
1.
https://blog.csdn.net/Vitalia/article/details/146083103
问题描述
N-皇后问题是在一个N×N的棋盘上放置N个皇后,使得它们互不攻击。皇后可以攻击同一行、同一列或同一对角线上的任何棋子。因此,需要找到所有可能的皇后位置,满足这些条件。
示例 1:
输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:存在两种不同的4-皇后问题的解,如上图所示。
示例 2:
输入:n = 1
输出:[["Q"]]
关键点
- 棋盘大小:N×N的棋盘。
- 皇后数量:N个皇后。
- 攻击规则:
- 不能在同一行。
- 不能在同一列。
- 不能在同一对角线。
解决方法
回溯算法
- 逐行放置皇后。
- 每放置一个皇后,检查是否与已放置的皇后冲突。
- 如果冲突,回溯并尝试下一个位置。
- 找到所有可能的解。
递归实现
- 使用递归尝试每一行的每个位置。
- 通过剪枝减少无效搜索。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 检查当前位置 (row, col) 是否可以放置皇后
bool isSafe(int row, int col, vector<string>& board, int n) {
// 检查列
for (int i = 0; i < row; i++) {
if (board[i][col] == 'Q') {
return false;
}
}
// 检查左上对角线
for (int i = row, j = col; i >= 0 && j >= 0; i--, j--) {
if (board[i][j] == 'Q') {
return false;
}
}
// 检查右上对角线
for (int i = row, j = col; i >= 0 && j < n; i--, j++) {
if (board[i][j] == 'Q') {
return false;
}
}
return true;
}
// 回溯函数
void solve(int row, vector<string>& board, vector<vector<string>>& result, int n) {
// 如果当前行是最后一行,说明找到一个解
if (row == n) {
result.push_back(board); // 将当前棋盘配置存入结果
return;
}
// 尝试在当前行的每一列放置皇后
for (int col = 0; col < n; col++) {
if (isSafe(row, col, board, n)) { // 如果当前位置安全
board[row][col] = 'Q'; // 放置皇后
solve(row + 1, board, result, n); // 递归到下一行
board[row][col] = '.'; // 回溯,撤销皇后
}
}
}
// 主函数:求解 N-皇后问题
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> result; // 存储所有解
vector<string> board(n, string(n, '.')); // 初始化棋盘,所有位置为空('.')
solve(0, board, result, n); // 从第 0 行开始回溯
return result;
}
代码解释
isSafe
函数:检查当前位置(row, col)
是否可以放置皇后。检查列、左上对角线和右上对角线是否有冲突。solve
函数:使用回溯算法逐行尝试放置皇后。如果找到一个有效位置,递归到下一行。如果当前行所有位置都尝试完毕,回溯并撤销上一步的皇后。solveNQueens
函数:初始化棋盘(用'.'
表示空位)。调用solve
函数开始求解。
复杂度分析
- 时间复杂度:O(N!),因为每行有N种选择,且需要检查冲突。
- 空间复杂度:O(N^2),用于存储棋盘和递归栈。
热门推荐
吃完苹果可以喝中药吗
安卓备份数据备份怎么打开照片
小区充电桩电动车24小时可用电多少度?
Git 分支操作全解析:创建、切换、合并、删除及冲突解决
产品交付能力提升的探索与分享
司马睿不是司马家的人吗?真相到底是什么样的?
但是,先学会如何摔倒
商标注册24类究竟包含哪些具体内容?
三人游戏简单又好玩的是什么 2025耐玩的联机手游盘点
Nat Cell Biol | 脂质动员可驱动线粒体应激后的功能恢复
Nat Cell Biol | 脂质动员可驱动线粒体应激后的功能恢复
酒泉必去十大景点推荐,酒泉最值得去的10个地方,有空全部玩一遍
战神阿瑞斯的身世如何?他和雅典娜是什么关系?
H5N1禽流感在美蔓延 多国严阵以待
2025上军校需要什么条件?毕业直接是军官吗?是什么军衔?
尼古丁中毒怎么回事,怎么办
如何选择和判断合适的商铺投资项目?这类项目的风险评估如何?
《因果报应》:悬疑片的“反转”应该这么拍
屏幕镜像-AirPlay屏幕镜像无法搜索到电视,相应的解决方法
详解失信被执行人制度:如何被列入及应对措施
静脉曲张微创手术是怎么做的
如何编辑微博图文让你快速吸引关注
正确应对和科学康复,才能摆脱大腿肌肉拉伤之“痛”
【C++】质因数分解问题详解与代码实现
资源管理:构建可持续未来的关键所在
電視信號與天線:如何優化接收效果?
上海的气韵 | 一次手工活体验非遗碰撞二次元
企业收入与支出的会计处理:法律视角下的实务指南
悲剧频发,美国枪支管控政策与其他国家相比,差异在哪?
光伏逆变器详解:原理、功能与选购指南