📑 题目:52. N皇后 II

🚀 本题 LeetCode 传送门

题目大意

给定一个整数 n,返回 n 皇后不同的解决方案的数量。

解题思路

  • 这一题是第 51 题的加强版,在第 51 题的基础上累加记录解的个数即可。
  • 这一题也可以暴力打表法,时间复杂度为 O(1)。

代码

  1. package leetcode
  2. // 解法一,暴力打表法
  3. func totalNQueens(n int) int {
  4. res := []int{0, 1, 0, 0, 2, 10, 4, 40, 92, 352, 724}
  5. return res[n]
  6. }
  7. // 解法二,DFS 回溯法
  8. func totalNQueens1(n int) int {
  9. col, dia1, dia2, row, res := make([]bool, n), make([]bool, 2*n-1), make([]bool, 2*n-1), []int{}, 0
  10. putQueen52(n, 0, &col, &dia1, &dia2, &row, &res)
  11. return res
  12. }
  13. // 尝试在一个n皇后问题中, 摆放第index行的皇后位置
  14. func putQueen52(n, index int, col, dia1, dia2 *[]bool, row *[]int, res *int) {
  15. if index == n {
  16. *res++
  17. return
  18. }
  19. for i := 0; i < n; i++ {
  20. // 尝试将第index行的皇后摆放在第i列
  21. if !(*col)[i] && !(*dia1)[index+i] && !(*dia2)[index-i+n-1] {
  22. *row = append(*row, i)
  23. (*col)[i] = true
  24. (*dia1)[index+i] = true
  25. (*dia2)[index-i+n-1] = true
  26. putQueen52(n, index+1, col, dia1, dia2, row, res)
  27. (*col)[i] = false
  28. (*dia1)[index+i] = false
  29. (*dia2)[index-i+n-1] = false
  30. *row = (*row)[:len(*row)-1]
  31. }
  32. }
  33. return
  34. }
  35. // 解法三 二进制位操作法
  36. // class Solution {
  37. // public:
  38. // int totalNQueens(int n) {
  39. // int ans=0;
  40. // int row=0,leftDiagonal=0,rightDiagonal=0;
  41. // int bit=(1<<n)-1;//to clear high bits of the 32-bit int
  42. // Queens(bit,row,leftDiagonal,rightDiagonal,ans);
  43. // return ans;
  44. // }
  45. // void Queens(int bit,int row,int leftDiagonal,int rightDiagonal,int &ans){
  46. // int cur=(~(row|leftDiagonal|rightDiagonal))&bit;//possible place for this queen
  47. // if (!cur) return;//no pos for this queen
  48. // while(cur){
  49. // int curPos=(cur&(~cur + 1))&bit;//choose possible place in the right
  50. // //update row,ld and rd
  51. // row+=curPos;
  52. // if (row==bit) ans++;//last row
  53. // else Queens(bit,row,((leftDiagonal|curPos)<<1)&bit,((rightDiagonal|curPos)>>1)&bit,ans);
  54. // cur-=curPos;//for next possible place
  55. // row-=curPos;//reset row
  56. // }
  57. // }
  58. // };