51. N 皇后
题目链接:51. N 皇后
思路
解这道题可以分为几个部分:
- 判断局面合法性
特别的是,在判断当前局面合法性时,只需考虑该棋子上面三种情况,具体看代码即可。 - 将结果按规定格式返回
主要涉及到strings.Join()的使用,通过该函数可以将字符串使用特定的符号隔开。 - 递归回溯部分
递归到叶子节点就将结果加入res并返回进行回溯,否则继续递归。
解题代码
func solveNQueens(n int) [][]string {
var res [][]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 dfs func(row int)
dfs = func(row int){
if row == n{
temp := make([]string,n)
for i,v := range chessBoard{
temp[i] = strings.Join(v,"")
}
res = append(res,temp)
return
}
for i:=0;i<n;i++{
if isValid(n,row,i,chessBoard){
chessBoard[row][i] = "Q"
dfs(row+1)
chessBoard[row][i] = "."
}
}
}
dfs(0)
return res
}
func isValid(n int, row int, col int, chessBoard [][]string) 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,j=i-1,j-1{
if chessBoard[i][j] == "Q" {
return false
}
}
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
}