原题地址(困难)

方法1—回溯

思路

基本和51题是一个题,建议先做那一道题。

51. N 皇后

代码

  1. class Solution {
  2. public:
  3. vector<int> a, b, column;
  4. int ans;
  5. int totalNQueens(int n) {
  6. // 主对角线方向,副对角线方向,列方向
  7. a.resize(2*n+1, 0);
  8. b.resize(2*n+1, 0);
  9. column.resize(n, 0);
  10. ans = 0;
  11. dfs(0, n);
  12. return ans;
  13. }
  14. void dfs(int row, int n) {
  15. if(row == n){
  16. ans++;
  17. return;
  18. }
  19. // 对第row行的每一列
  20. for(int j=0; j<n; j++){
  21. //如果(row, j)这个位置满足行列左斜右斜都没有重复皇后
  22. if(!a[row+n-1-j] && !b[row+j] && !column[j]){
  23. a[row+n-1-j] = b[row+j] = column[j] = 1;
  24. dfs(row+1, n);
  25. a[row+n-1-j] = b[row+j] = column[j] = 0;
  26. }
  27. }
  28. return;
  29. }
  30. };

时空复杂度

时间复杂度 O(N!)
空间复杂度 O(2N+1)