diff --git a/chap2/chap2 b/chap2/chap2 new file mode 100755 index 0000000..3568250 Binary files /dev/null and b/chap2/chap2 differ diff --git a/chap2/chap2.go b/chap2/chap2.go new file mode 100644 index 0000000..e594858 --- /dev/null +++ b/chap2/chap2.go @@ -0,0 +1,60 @@ +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) +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..37f8918 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module gitea.paas.celticinfo.fr/oabrivard/gogcp + +go 1.21.5