题目介绍
描述
N 皇后问题是指在 n * n 的棋盘上要摆 n 个皇后,
要求:任何两个皇后不同行,不同列也不在同一条斜线上,
求给一个整数 n ,返回 n 皇后的摆法数。
数据范围:
1≤n≤9
例如当输入4时,对应的返回值为2,
对应的两种四皇后摆位如下图所示:
以下是官方题解
class Solution {
public:
//判断皇后是否符合条件
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) {
int res = 0;
//下标为行号,元素为列号,记录皇后位置
vector<int> pos(n, 0);
//递归
recursion(n, 0, pos, res);
return res;
}
};
但实际上其中的一行判断条件有问题
if(row == i || col == pos[i] || abs(row - i) == abs(col - pos[i])) return false;
这一行可以改成:
if(col == pos[i] || abs(row - i) == abs(col - pos[i])) return false;
其实联系一下上下文就能知道第一个条件不可能实现,因为本质上这个循环就是一行一行进行的,不会出现这个判断里面符合第一个条件的情况
参考链接链接: link