N-Queens -- 回溯法 -- 力扣101算法题解笔记

6.3N-Queens -- 回溯法

题目描述

先说一下,这个题目十分之困难。

给定一个大小为n的正方形国际象棋棋盘,求有多少种方式可以放置n个皇后,并使得她们互不攻击,即每一行、列、左斜、右斜最多只有一个皇后

输入输出样例

Input :4

Output: [[".Q..", "...Q","Q...","..Q."], // Solution 1

"..Q.", "Q...","...Q",".Q.."\]\] // Solution 2 注:.表示空白位置,Q代表皇后 ### 题解 类似于在矩阵中寻找字符串,本体也是通过修改状态矩阵来进行回溯操作,不同的是,我们需要对每一行列,左斜右斜,建立访问数组,来记录他们是否存在皇后。 注意,本题有一个隐藏条件,是满足条件的结果中每一行或列有且仅有一个皇后。这是因为我们一共只有n行n列。所以,**如果我们通过对每一行遍历来插入皇后,我们就不需要对行建立访问数组了。** 这个是缓解这题难度的关键 ```cpp #include #include using namespace std; void backtracking(vector>& ans, vector& board, vector &column, vector &ldiag, vector &rdiag, int row, int n) { if (row == n) { ans.push_back(board); return; } for (int i = 0; i < n; ++i) { if (column[i] || ldiag[n - row + i - 1] || rdiag[row + i + 1]) { continue; } //修改当前节点状态 board[row][i] = 'Q'; column[i] = ldiag[n - row + i - 1] = rdiag[row + i + 1] = true; //递归子节点 backtracking(ans, board, column, ldiag, rdiag, row + 1, n); //回改当前节点状态 board[row][i] = '.'; column[i] = ldiag[n - row + i - 1] = rdiag[row + i + 1] = false; } } vector> solveNQueens(int n) { vector> ans; if (n == 0) { return ans; } vector board(n, string(n, '.')); vector column(n, false), ldiag(2 * n - 1, false), rdiag(2 * n - 1, false); backtracking(ans, board, column, ldiag, rdiag, 0, n); return ans; } int main() { int n = 4; vector> res = solveNQueens(n); for (int i = 0; i < res.size(); ++i) { cout << "["; for (int j = 0; j < res[i].size(); ++j) { cout << " \"" << res[i][j] << "\""; if (j != res[i].size() - 1) { cout << ","; } cout << endl; } if (i != res.size() - 1) { cout << " ]," << endl; } else { cout << " ]" << endl; } cout << " // Solution " << i + 1 << endl; } cout << "]" << endl; return 0; } ```

相关推荐
MX_93592 小时前
Spring组件扫描原理解析
java·后端·spring
xuxianliang2 小时前
第152章 纲领的统一(悦儿)
算法·程序员创富
让我上个超影吧2 小时前
天机学堂——领取优惠券优化
java
输出输入2 小时前
Java Swing和JavaFX用哪个好
java·前端
星火开发设计2 小时前
C++ 异常处理:try-catch-throw 的基本用法
java·开发语言·jvm·c++·学习·知识·对象
没有bug.的程序员2 小时前
分布式配置深潜:Spring Cloud Config 与 Git 集成内核、版本回滚机制与多环境治理实战指南
java·分布式·git·spring cloud·分布式配置·版本回滚
好家伙VCC2 小时前
# 发散创新:基于ARCore的实时3D物体识别与交互开发实战 在增强现实(
java·python·3d·ar·交互
清水白石0082 小时前
函数签名内省实战:打造通用参数验证装饰器的完整指南
java·linux·数据库
XLYcmy2 小时前
智能体大赛 技术架构 核心驱动层
人工智能·算法·机器学习·llm·prompt·agent·qwen