@@ -48,38 +48,48 @@ func generateBoard(n int, row *[]int) []string {
48
48
}
49
49
50
50
// 解法二 二进制操作法
51
- // class Solution
52
- // {
53
- // int n;
54
- // string getNq(int p)
55
- // {
56
- // string s(n, '.');
57
- // s[p] = 'Q';
58
- // return s;
59
- // }
60
- // void nQueens(int p, int l, int m, int r, vector<vector<string>> &res)
61
- // {
62
- // static vector<string> ans;
63
- // if (p >= n)
64
- // {
65
- // res.push_back(ans);
66
- // return ;
67
- // }
68
- // int mask = l | m | r;
69
- // for (int i = 0, b = 1; i < n; ++ i, b <<= 1)
70
- // if (!(mask & b))
71
- // {
72
- // ans.push_back(getNq(i));
73
- // nQueens(p + 1, (l | b) >> 1, m | b, (r | b) << 1, res);
74
- // ans.pop_back();
75
- // }
76
- // }
77
- // public:
78
- // vector<vector<string> > solveNQueens(int n)
79
- // {
80
- // this->n = n;
81
- // vector<vector<string>> res;
82
- // nQueens(0, 0, 0, 0, res);
83
- // return res;
84
- // }
85
- // };
51
+ func solveNQueens2 (n int ) (res [][]string ) {
52
+ placements := make ([]string , n )
53
+ for i := range placements {
54
+ buf := make ([]byte , n )
55
+ for j := range placements {
56
+ if i == j {
57
+ buf [j ] = 'Q'
58
+ } else {
59
+ buf [j ] = '.'
60
+ }
61
+ }
62
+ placements [i ] = string (buf )
63
+ }
64
+
65
+ var construct func (prev []int )
66
+ construct = func (prev []int ) {
67
+ if len (prev ) == n {
68
+ plan := make ([]string , n )
69
+ for i := 0 ; i < n ; i ++ {
70
+ plan [i ] = placements [prev [i ]]
71
+ }
72
+ res = append (res , plan )
73
+ return
74
+ }
75
+
76
+ occupied := 0
77
+ for i := range prev {
78
+ dist := len (prev ) - i
79
+ bit := 1 << prev [i ]
80
+ occupied |= bit | bit << dist | bit >> dist
81
+ }
82
+
83
+ prev = append (prev , - 1 )
84
+ for i := 0 ; i < n ; i ++ {
85
+ if (occupied >> i )& 1 != 0 {
86
+ continue
87
+ }
88
+ prev [len (prev )- 1 ] = i
89
+ construct (prev )
90
+ }
91
+ }
92
+
93
+ construct (make ([]int , 0 , n ))
94
+ return
95
+ }
0 commit comments