按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n
个皇后放置在 n×n
的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n
,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例 1:
输入:n = 4 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]] 解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1 输出:[["Q"]]
提示:
1 <= n <= 9
题解:
回溯法:
func solveNQueens(n int) [][]string {
// 声明和初始化变量
var result [][]string
chessboard := make([][]string, n)
for i := 0; i < n; i++ {
chessboard[i] = make([]string, n)
}
for i := 0; i < n; i++ {
for j := 0; j < n; j++ {
chessboard[i][j] = "."
}
}
// 皇后位置检查函数
var isValid func(n, row, col int, chessboard [][]string) bool
isValid = func(n, row, col int, chessboard [][]string) bool {
// 检查列里面是否有皇后
for i := 0; i < row; i++ {
if chessboard[i][col] == "Q" {
return false
}
}
// 检查 45 度角是否有皇后
for i, j := row-1, col-1; i >= 0 && j >= 0; i, j = i-1, j-1 {
if chessboard[i][j] == "Q" {
return false
}
}
// 检查 135 度角是否有皇后
for i, j := row-1, col+1; i >= 0 && j < n; i, j = i-1, j+1 {
if chessboard[i][j] == "Q" {
return false
}
}
return true
}
var backtracking func(row int)
backtracking = func(row int) {
if row == n {
tmp := make([]string, n)
for i, rowStr := range chessboard {
tmp[i] = strings.Join(rowStr, "")
}
result = append(result, tmp)
return
}
for i := 0; i < n; i++ {
if isValid(n, row, i, chessboard) {
chessboard[row][i] = "Q"
backtracking(row + 1)
chessboard[row][i] = "."
}
}
}
backtracking(0)
return result
}
评论前必须登录!
注册