From cff768e63ccf95ba1433c874d31d781028e7d98c Mon Sep 17 00:00:00 2001 From: Hanlin Shi Date: Mon, 31 May 2021 00:43:43 -0700 Subject: [PATCH] Add solution for N-Queen problem which uses bit-operation Still uses DFS, optimized for state compression. Signed-off-by: Hanlin Shi --- leetcode/0051.N-Queens/51. N-Queens.go | 80 +++++++++++++++----------- 1 file changed, 45 insertions(+), 35 deletions(-) diff --git a/leetcode/0051.N-Queens/51. N-Queens.go b/leetcode/0051.N-Queens/51. N-Queens.go index de68f47b..040718dd 100644 --- a/leetcode/0051.N-Queens/51. N-Queens.go +++ b/leetcode/0051.N-Queens/51. N-Queens.go @@ -48,38 +48,48 @@ func generateBoard(n int, row *[]int) []string { } // 解法二 二进制操作法 -// class Solution -// { -// int n; -// string getNq(int p) -// { -// string s(n, '.'); -// s[p] = 'Q'; -// return s; -// } -// void nQueens(int p, int l, int m, int r, vector> &res) -// { -// static vector ans; -// if (p >= n) -// { -// res.push_back(ans); -// return ; -// } -// int mask = l | m | r; -// for (int i = 0, b = 1; i < n; ++ i, b <<= 1) -// if (!(mask & b)) -// { -// ans.push_back(getNq(i)); -// nQueens(p + 1, (l | b) >> 1, m | b, (r | b) << 1, res); -// ans.pop_back(); -// } -// } -// public: -// vector > solveNQueens(int n) -// { -// this->n = n; -// vector> res; -// nQueens(0, 0, 0, 0, res); -// return res; -// } -// }; +func solveNQueens2(n int) (res [][]string) { + placements := make([]string, n) + for i := range placements { + buf := make([]byte, n) + for j := range placements { + if i == j { + buf[j] = 'Q' + } else { + buf[j] = '.' + } + } + placements[i] = string(buf) + } + + var construct func(prev []int) + construct = func(prev []int) { + if len(prev) == n { + plan := make([]string, n) + for i := 0; i < n; i++ { + plan[i] = placements[prev[i]] + } + res = append(res, plan) + return + } + + occupied := 0 + for i := range prev { + dist := len(prev) - i + bit := 1 << prev[i] + occupied |= bit | bit<>dist + } + + prev = append(prev, -1) + for i := 0; i < n; i++ { + if (occupied>>i)&1 != 0 { + continue + } + prev[len(prev)-1] = i + construct(prev) + } + } + + construct(make([]int, 0, n)) + return +}