funcmain() { fourQueen := solveNQueens(4) for _, v := range fourQueen { for _, vv := range v { fmt.Println(vv) } fmt.Println("------------------------") }
eightQueen := solveNQueens(8) for _, v := range eightQueen { for _, vv := range v { fmt.Println(vv) } fmt.Println("------------------------") } }
funcsolveNQueens(n int) (ans [][]string) { var backtrack func([]int) backtrack = func(vector []int) { // 递归终止条件 if isConflict(vector) { return } elseiflen(vector) == n { ans = append(ans, output(vector)) return }
for i := 0; i < n; i++ { newVector := make([]int, len(vector)) copy(newVector, vector) newVector = append(newVector, i) backtrack(newVector) } }
// vector[i]表示第i个皇后在第i行的位置 var vector []int backtrack(vector) return }
// 所有的皇后是否有冲突 funcisConflict(vector []int)bool { // 只需判断新添加的(最后一个)皇后和已有的皇后是否有冲突 for i := 0; i < len(vector)-1; i++ { if _isConflict(i, vector[i], len(vector)-1, vector[len(vector)-1]) { returntrue } } returnfalse }