N皇后问题是把N个皇后放在一个N×N棋盘上,使皇后之间不会互相攻击。
给出一个整数n,返回n皇后问题的所有摆放方案
例如:
4皇后问题有两种摆放方案
[".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ]
皇后可以怎么移动呢?同一行、同一列、同一斜线上的皇后都会自动攻击
思路:保证各个位置的皇后不在同一行、同一列、同一斜线上,那就是每一行一个,每一列一个,每一个斜线一个。那就是递归获取每一行的结果,找到一行就递归找下一行
package main
/**
*
* @param n int整型
* @return string字符串二维数组
*/
func solveNQueens(n int) [][]string {
// write code here
var res [][]string
queens := make([][][]int, 0)
getQueens(nil, 0, n, &queens)
//fmt.Print(len(queens))
for _, item := range queens {
tmp := make([]string, n)
for _, value := range item {
str := ""
for i := 0; i < n; i++ {
if value[1] == i {
str += "Q"
} else {
str += "."
}
}
tmp[value[0]] = str
}
res = append(res, tmp)
}
return res
}
//找第i行皇后的位置,tmp临时的皇后位置,queens最终的皇后位置结果
func getQueens(tmp [][]int, i int, n int, queens *[][][]int) {
//如果已经找到n个就写入最终结果
if i >= n {
*queens = append(*queens, tmp)
return
}
for j := 0; j < n; j++ {
//判断i,j是否可用
flag := true
if tmp != nil {
for _, item := range tmp {
//如果存在一行一列还有斜率为1,直接认为不可用
if i == item[0] || j == item[1] || j-item[1] == i-item[0] || j-item[1] == -(i-item[0]) {
flag = false
break
}
}
}
//如果可用,找下一层
if flag {
newTmp := append([][]int{}, tmp...)
getQueens(append(newTmp, []int{i, j}), i+1, n, queens)
}
}
}