题目
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-queens
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
样例
示例 2:
输入:n = 1
输出:[[“Q”]]
数据范围
1 <= n <= 9
分析
解读题意,给定一个n,返回nn棋盘上n个皇后所有摆放合法的情况。
递归回溯的经典问题n皇后,递归思路:建立一个nn的数组表示当前的棋盘摆放情况,再建立一个n*n的数组表示当前可以摆放的位置,0表示可以摆放,1表示不可以,按行的顺序摆放皇后,每次摆放后,更新判断状态的数组,递归完成后回溯,将当前放皇后的位置回溯到最初的状态,状态的数组同时也需要回溯到上一步的状态。最后将摆放完成的情况放到答案的数组中
代码部分
1.初始化
分析递归需要的参数
1.题目中给定的n作为出口条件的判断
2.存放当前棋盘皇后的位置数组
3.存放当前哪个格子可以放皇后的数组
4.存放最终答案的数组
vector<vector<string> > ans; //存放答案
vector<string> location(n); //存放当前的棋盘
vector<vector<bool> > mark(n,vector<bool>(n)); //当前棋盘的状态
初始化当前放皇后的棋盘,将当前的n*n数组所有元素初始化为’.’
void inilocation(vector<string> &location,int n)
{
for(int i=0;i<n;i++)
{
location[i].append(n,'.');
}
}
初始化存放状态的数组,将所有格子都初始化为0
void inimark(vector<vector<bool> > &mark,int n) //初始化棋盘状态
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
mark[i][j]=false;
}
}
2.递归部分
递归还是分成两个部分,首先分析当前要做的事情,最后分析出口条件
当前要做的事情就是遍历所有的列,判断在哪里可以摆放然后递归深入
回溯部分,将当前的皇后位置回溯,将状态数组回溯,这里创建一个状态数组的镜像,回溯的时候直接将镜像赋值给当前的状态数组即可
//现在能做的事情
for(