题目地址:https://leetcode.cn/problems/n-queens/description/?envType=study-plan-v2&envId=top-100-liked
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
import "math"
var queen [][]string
func solveNQueens(n int) [][]string {
// 用于保存所有可能
queen = [][]string{}
solve(0, make([]int, n), n)
return queen
}
// path[] 用于保存第i(path的下标)行的第j(path[i]的值)列放有皇后
func solve(i int, path []int, n int) {
if i == n {
// 如果 i == n 说明已经走到最后了
queen = append(queen, generate(path, n))
}
// 遍历所有列
for j := 0; j < n; j++ {
// 检查当前位置是否可以放皇后
if check(path, i, j) {
// 标记当前行的哪一列可以放皇后
path[i] = j
// 解决下一行
solve(i+1, path, n)
}
}
}
func check(path []int, i, j int) bool {
for k := 0; k < i; k++ {
// 如果 path[k] == j 则该列已经有皇后了
// 如果 math.Abs(float64(i-k)) == math.Abs(float64(j-path[k])) 说明对角线有皇后了
if path[k] == j || math.Abs(float64(i-k)) == math.Abs(float64(j-path[k])) {
return false
}
}
return true
}
// 生成棋盘状况
func generate(path []int, n int) []string {
gen := make([]byte, n)
board := []string{}
for i := 0; i < n; i++ {
for j := 0; j < n; j++ {
gen[j] = '.'
}
gen[path[i]] = 'Q'
board = append(board, string(gen))
}
return board
}
8万+

被折叠的 条评论
为什么被折叠?



