下面是代码:
import "fmt"
var Res [][]string
var N int
func Recursion(mid []string, i,j int){
// mid代表存储中间结果的string切片,i代表棋盘的第几行,j代表第几列已经有Q了
// 对插入的这个位置左上、上、右上进行判断,是否存在皇后
// 先判断上
for idx:=i-1;idx>=0;idx--{
if mid[idx][j] == 'Q'{
return
}
}
// 再判断左上
for x,y:=i-1,j-1;x>=0&&y>=0;x,y=x-1,y-1{
if mid[x][y] == 'Q'{
return
}
}
// 再判断右上
for x,y:=i-1,j+1;x>=0&&y<N;x,y=x-1,y+1{
if mid[x][y] == 'Q'{
return
}
}
if i==N-1{
// 遍历过了最后一行,直接结束
Res = append(Res, mid)
return
}
subMid := make([]byte, 0)
for idx := 0; idx < N; idx++ {
subMid = append(subMid, '.')
}
for idx:=0;idx<N;idx++{
subMid[idx] = 'Q'
length := len(mid)
Recursion(append(mid[:length:length], string(subMid)), i+1, idx)
subMid[idx] = '.'
}
}
func solveNQueens(n int) [][]string {
N = n
Res = make([][]string, 0)
Recursion(make([]string, 0), -1,-1)
return Res
}
func main() {
res := solveNQueens(4)
fmt.Println(res)
}
本文来自:Segmentfault
感谢作者:SyntaxError
查看原文:N皇后问题(Go版本)
相关阅读 >>
Golang—literal copies lock value from gzpool: sync.pool contains sync.nocopy
更多相关阅读请进入《Go》频道 >>

Go语言101
一个与时俱进的Go编程知识库。