原题地址(困难)
方法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)
