原题地址(困难)
方法1—回溯
思路
基本和51题是一个题,建议先做那一道题。
代码
class Solution {
public:
vector<int> a, b, column;
int ans;
int totalNQueens(int n) {
// 主对角线方向,副对角线方向,列方向
a.resize(2*n+1, 0);
b.resize(2*n+1, 0);
column.resize(n, 0);
ans = 0;
dfs(0, n);
return ans;
}
void dfs(int row, int n) {
if(row == n){
ans++;
return;
}
// 对第row行的每一列
for(int j=0; j<n; j++){
//如果(row, j)这个位置满足行列左斜右斜都没有重复皇后
if(!a[row+n-1-j] && !b[row+j] && !column[j]){
a[row+n-1-j] = b[row+j] = column[j] = 1;
dfs(row+1, n);
a[row+n-1-j] = b[row+j] = column[j] = 0;
}
}
return;
}
};
时空复杂度
时间复杂度 O(N!)
空间复杂度 O(2N+1)