方法:回溯+递归
按照题设可以得出:棋盘每一行有且只有一个皇后。根据该特性,使用数组res[n]记录每一行皇后所在的列数。从第一行开始,遍历每一列,判断不同列放置皇后是否有效(不能跟前面所放置的皇后 列数一样,不能处于对角线);向下递归,当到达最后一行时,摆法加1,进行回溯。
时间复杂度:o(n! * n)。遍历皇后的位置需要o(n!),有效性判断需要o(n)。
空间复杂度:o(n)。需要数组来记录每一行皇后所在的列数。
class Solution { public: int Nqueen(int n) { vector<int> res(n, 0); int num = 0; rescure(n, 0, res, num); return num; } void rescure(int n, int idx, vector<int>& res, int& num) { if (idx == n) { num++; return; } for (int i = 0; i < n; i++) { if (isvalid(idx, i, res)) { res[idx] = i; //进入下一行 rescure(n, idx + 1, res, num); } } } //判断有效性 bool isvalid(int row, int col, vector<int>& res) { for (int i = 0; i < row; i++) { if (res[i] == col || row == i || abs(i - row) == abs(res[i] - col)) return false; } return true; } };