LeetCode51. N皇后Golang版
1. 问题描述
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
2. 思路
回溯法模板题
3. 代码
func solveNQueens(n int) [][]string {
var res [][]string
var chessboard []string
initialRow := ""
for i := 0; i < n; i++ {
initialRow += "."
}
for i := 0; i < n; i++ {
chessboard = append(chessboard, initialRow)
}
backtracking(n, 0 ,chessboard, &res)
return res
}
func backtracking(n int, row int, chessboard []string, res *[][]string) {
if row == n {
temp := make([]string, len(chessboard))
copy(temp, chessboard)
*res = append(*res, temp)
return
}
for col := 0; col < n; col++ {
if isValid(row, col, chessboard, n) {
cb := []byte(chessboard[row])
cb[col] = 'Q'
chessboard[row] = string(cb)
backtracking(n, row + 1, chessboard, res)
cb1 := []byte(chessboard[row])
cb1[col] = '.'
chessboard[row] = string(cb1)
}
}
}
func isValid(row int, col int, chessboard []string, n int) bool {
for i := 0; i < row; i++ {
if chessboard[i][col] == 'Q' {
return false
}
}
for i,j := row - 1, col - 1; i >= 0 && j >= 0; i-- {
if chessboard[i][j] == 'Q' {
return false
}
j--
}
for i,j := row - 1, col + 1; i >= 0 && j < n; i-- {
if chessboard[i][j] == 'Q' {
return false
}
j++
}
return true
}