一:题目
二:思路
思路:
1.这里在选择建树(也就是在选择解的空间上)是 子集树
2.那么在结点上我们选择的是一个二维的矩阵就是将最后的结果落实到一个二维容器里
也就遍历到叶节点时候一种可行解的情况
3.写码思路:
<1>:递归函数的参数:
backtacking(int row,vector &v,int n)
row:代表矩阵的行数
vector &v:存放的是最后二维矩阵的可行解
n:代表的是棋盘的宽度和长度
<2>:输出结果
这里使用 vector<vector> v;
来处理每次的可行接
<3>:单层循环
这里横向每层的循环是遍历不同的列,横向的是递归二维矩阵不同的行(往下进行)
<4>:递归终止条件
当 row == n 时候,我们就可以将一次可行解装入容器了
4.这里还需补充的是在递归函数里,我们在每次选择皇后的位置的时候要注意题目的要求
不同行,不同列 不在同一条斜线上
不同行:因为我们是逐层往下递归的所以不同行我们就解决了
不同列:这里看代码
不在一条斜线上:(分为45° 和 135°) 这里图解
三:上码
class Solution {
public:vector<vector<string> > ans;//判断位置是否合法
bool isLegal(int row,int cal,vector<string> &v,int n){//判断是否在一列上for (int i = 0; i < row; i++) {//这里我们只判断从row往上的行即可if (v[i][cal] == 'Q') return false;}//判断是否在135°斜线上上for (int i = row - 1, j = cal - 1; i >= 0 && j >= 0; i--,j--) {if (v[i][j] == 'Q') return false;}//判断是否在45°斜线上for (int i = row - 1,j = cal + 1; i >= 0 && j <= n; i--,j++){if (v[i][j] == 'Q') return false;}return true; }void backtacking(int row,vector<string> &v,int n) {if (row == n) {ans.push_back(v);return;}for (int cal = 0; cal < n; cal++) {//cal:列if (isLegal(row,cal,v,n)) {v[row][cal] = 'Q';//这是满足条件的backtacking(row+1,v,n);v[row][cal] = '.';//当一次可行结果 结束后,需要v将空间腾出来,给后面的可行解 }}
}vector<vector<string>> solveNQueens(int n) {/**思路:1.这里在选择建树(也就是在选择解的空间上)是 子集树2.那么在结点上我们选择的是一个二维的矩阵就是将最后的结果落实到一个二维容器里也就遍历到叶节点时候一种可行解的情况3.写码思路:1>:递归函数的参数:backtacking(int row,vector<string> &v,int n)row:代表矩阵的行数vector<string> &v:存放的是最后二维矩阵的可行解n:代表的是棋盘的宽度和长度2>:输出结果这里使用 vector<vector<string >> v;来处理每次的可行接3>:单层循环这里横向每层的循环是遍历不同的列,横向的是递归二维矩阵不同的行(往下进行)4>:递归终止条件当 row == n 时候,我们就可以将一次可行解装入容器了4.这里还需补充的是在递归函数里,我们在每次选择皇后的位置的时候要注意题目的要求不同行,不同列 不在同一条斜线上不同行:因为我们是逐层往下递归的所以不同行我们就解决了不同列:这里看代码不在一条斜线上:(分为45° 和 135°) 这里图解 **/vector<string>v (n,string(n,'.'));//这传入的就是默认的二维矩阵..backtacking(0,v,n);return ans;}
};
加油 宝!!!!