> 文档中心 > LeetCode51-N皇后问题(Golang)

LeetCode51-N皇后问题(Golang)


题目链接: N皇后

 题意:

  • 给定一个 n*n 大小的棋盘,要求放入 n 个皇后,使得皇后之间不会相互攻击
  • 皇后的攻击路线是:同行、同列、同对角线

思路:

  • 深度优先搜索,DFS
  • 用三个数组表示当前状态下,哪些列和对角线已经被占据了,如果被占据了,就不能放入新的皇后,如果没有被占据,就放入新的皇后,并进行下一步搜索
  • 不需要对行的访问情况进行记录,因为搜索方向是向下搜索,一行只能有一只皇后
  • 列对角线数组需要开到 2*n ,因为对角线数量比n大

代码(Golang):

func solveNQueens(n int) [][]string {    ans:=make([][]string,0)    tmp:=make([][]byte,n)    for i:=0;i<n;i++{ tmp[i]=make([]byte,n) for j:=0;j<n;j++{     tmp[i][j]='.' }    }    visc,vislr,visrl:=make([]bool,n),make([]bool,n*2),make([]bool,n*2)    var dfs func(i int)    dfs=func(i int){ if i==n{     temp:=make([]string,n)     for k:=0;k<n;k++{  temp[k]=string(tmp[k])     }     ans=append(ans,temp)     return } for j:=0;j<n;j++{     if !visc[j] && !visrl[i+j] && !vislr[i-j+n]{  visc[j],visrl[i+j],vislr[i-j+n]=true,true,true  tmp[i][j]='Q'  dfs(i+1)  tmp[i][j]='.'  visc[j],visrl[i+j],vislr[i-j+n]=false,false,false     } }    }dfs(0)    return ans}

局座张召忠