12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- package main
- import (
- "strings"
- )
- func solveNQueens(n int) (solutions [][]string) {
- putX := make([]int, n)
- colLaid := make([]bool, n)
- mainLaid := make([]bool, 2*n) // Range of y-x is [1-n, n-1], so y-x+n -> [1, 2n-1]
- viceLaid := make([]bool, 2*n-1)
- for y, x := 0, 0; ; { // The ith queen
- for ; x < n; x++ {
- if !(colLaid[x] || mainLaid[y-x+n] || viceLaid[x+y]) {
- putX[y] = x
- colLaid[x] = true
- mainLaid[y-x+n] = true
- viceLaid[x+y] = true
- x = 0 // Next step
- y++
- break
- }
- }
- if x == n || y == n { // Not valid or finished
- if y == 0 { // If y is 0 and x is n, then all solutions are found
- return
- } else if y == n {
- solutions = append(solutions, make([]string, 0))
- l := len(solutions)
- var sb strings.Builder
- for i := 0; i < n; i++ {
- sb.Reset()
- for j := 0; j < n; j++ {
- if putX[i] == j {
- sb.WriteByte('Q')
- } else {
- sb.WriteByte('.')
- }
- }
- solutions[l-1] = append(solutions[l-1], sb.String())
- }
- }
- y-- // Back tracking
- x = putX[y]
- colLaid[x] = false
- mainLaid[y-x+n] = false
- viceLaid[x+y] = false
- x++
- }
- }
- }
- // func main() {
- // fmt.Println(solveNQueens(9))
- // }
|