@@ -48,38 +48,48 @@ func generateBoard(n int, row *[]int) []string {
4848}
4949
5050// 解法二 二进制操作法
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