描述
N 皇后问题是指在 n * n 的棋盘上要摆 n 个皇后,
要求:任何两个皇后不同行,不同列也不在同一条斜线上,
求给一个整数 n ,返回 n 皇后的摆法数。
数据范围: 1 \le n \le 91≤n≤9
要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n!)O(n!)
例如当输入4时,对应的返回值为2,
对应的两种四皇后摆位如下图所示:
示例1
输入:
1
返回值:
1
示例2
输入:
8
返回值:
92
知识点:递归
建立一个vector数组来保存行、列的值,从第一行开始循环判断,遍历每列,每列的遍历都是从第一列遍历到最后一列,这样第一行的每个列都会放皇后,再依次递归判断。每列都要判断是否满足不能同行同列同一斜线。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型 the n
* @return int整型
*/
//判断皇后是否符合条件
bool isValid(vector<int> &pos,int row,int col)
{
//遍历所有已经记录的行
for(int i=0;i<row;i++)
{
//不能同行同列同一斜线
if(row==i||col==pos[i]||abs(row-i)==abs(col-pos[i]))
return false;
}
return true;
}
//递归查看皇后种类
void recursion(int n,int row,vector<int> &pos,int &res)
{
//如果全部行都选择了位置,就加一(这里有个前提,选位置前已经满足了题干要求,能选完肯定就是满足要求的)
if(row==n)
{
res++;
return;
}
//如果没选完,继续
for(int i=0;i<n;i++)
{
//遍历每个列
//检查该位置是否符合条件
if(isValid(pos,row,i))
{
//加入位置
pos[row]=i;
//递归继续查找
recursion(n,row+1, pos,res);
}
}
}
int Nqueen(int n) {
// write code here
int res=0;
vector<int> pos(n,0);
recursion(n,0,pos, res);
return res;
}
};
总结:采用递归,最难的在于判断是否同一斜线。