N皇后是个很经典的搜索问题。
我们用一个visit数组来记录对应行的列。即visit[i]=j,对应坐标(i,j)
思路如下所示:
按照行去递归,按照列去循环。
对于特定的一行row,我们对所有可能的列号row遍历,对于所选定的坐标(row,col),再判断其是否合法。
判断合法的思路就是,对这个行号之前的已经选定的坐标与当前可能产生的坐标依次判断是否在一行,一列或者是斜线。如果都没有,那就可以产生这个坐标,即visit[row]=col,接着递归下一行。
代码如下所示:
class Solution {
public:
/**
*
* @param n int整型 the n
* @return int整型
*/
bool isValid(vector<int> &visit, int row, int col){
for(int i=0;i<row;++i){
if(col==visit[i] || abs(col-visit[i])==abs(row-i)){
return false;
}
}
return true;
}
void NqueenCore(int row, vector<int> visit, int &res, int n){
if(row==n){
res++;
return;
}
for(int col=0;col<n;++col){
if(isValid(visit, row, col)){
visit[row]=col;
NqueenCore(row+1, visit, res,n);
visit[row]=-1;
}
}
}
int Nqueen(int n) {
// write code here
int res=0;
vector<int> visit(n, -1);
NqueenCore(0, visit, res, n);
return res;
}
};