package main import "fmt" func searchSubsets(k, n int, subset []int) { if k == n+1 { // process subset fmt.Println(subset) } else { // include k in the subset subset = append(subset, k) searchSubsets(k+1, n, subset) subset = subset[:len(subset)-1] // don’t include k in the subset searchSubsets(k+1, n, subset) } } func searchPermutations(n int, permutation []int, chosen []bool) { if len(permutation) == n { // process permutation fmt.Println(permutation) } else { for i := 1; i <= n; i++ { if chosen[i] { continue } chosen[i] = true permutation = append(permutation, i) searchPermutations(n, permutation, chosen) chosen[i] = false permutation = permutation[:len(permutation)-1] } } } func searchQueens(y, n int, col, diag1, diag2 []bool) int { if y == n { return 1 } count := 0 for x := 0; x < n; x++ { if col[x] || diag1[x+y] || diag2[x-y+n-1] { continue } col[x], diag1[x+y], diag2[x-y+n-1] = true, true, true count += searchQueens(y+1, n, col, diag1, diag2) col[x], diag1[x+y], diag2[x-y+n-1] = false, false, false } return count } func main() { searchSubsets(1, 4, []int{}) searchPermutations(4, []int{}, make([]bool, 4+1)) const NB_QUEENS = 16 count := searchQueens(0, NB_QUEENS, make([]bool, NB_QUEENS*NB_QUEENS), make([]bool, NB_QUEENS*NB_QUEENS), make([]bool, NB_QUEENS*NB_QUEENS)) fmt.Println(count) }