1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| package main
import ( "fmt" )
func process(n int) int { if n <= 0 { return 0 } count := 0 record := make([]int, n)
var ret [][][]int backtrack(0, n, &count, record, &ret) showRet(&ret) return count }
func showRet(ret *[][][]int) { fmt.Printf("-------------------------------一共有%d种解法-------------------------------\n", len(*ret)) for i := 0; i < len(*ret); i++ { fmt.Printf("第%d种解法\n", i+1) fmt.Println((*ret)[i]) } }
func printToRet(ret *[][][]int, record []int) { matrix := make([][]int, len(record))
for i := 0; i < len(record); i++ { for j := 0; j < len(record); j++ { if record[i] != j { matrix[i] = append(matrix[i], 0) } else { matrix[i] = append(matrix[i], 1) } } }
*ret = append(*ret, matrix) }
func backtrack(i, n int, count *int, record []int, ret *[][][]int) { if i == n { printToRet(ret, record) *count++ return }
for index := 0; index < n; index++ { if isValid(record, i, index) { record[i] = index backtrack(i+1, n, count, record, ret) record[i] = 0 } } }
func isValid(record []int, row, col int) bool { for i := 0; i < row; i++ { if record[i] == col || abs(row, i) == abs(col, record[i]) { return false } } return true }
func abs(a, b int) int { if a > b { return a - b } return b - a }
func main() { process(8) }
|