n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

上图为 8 皇后问题的一种解法。

给定一个整数 n,返回 n 皇后不同的解决方案的数量。

示例:

输入: 4
输出: 2
解释: 4 皇后问题存在如下两个不同的解法。
[
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]

与上道题类似,但只是求个数,并没有想到简化的方法,只是返回结构有变化。

private int ret=0;
private boolean[] v0;
private boolean[] v1;
private boolean[] v2;
public int totalNQueens(int n) {
    v0=new boolean[n];
    v1=new boolean[2*n-1];
    v2=new boolean[2*n-1];
    helper(n,0);
    return ret;
}
public void helper(int n,int i){
    if(i==n){
        ret++;
        return;
    }
    for(int j=0;j<n;j++){
        if(v0[j]||v1[i+j]||v2[i-j+n-1]) continue;
        v0[j]=v1[i+j]=v2[i-j+n-1]=true;
        helper(n,i+1);
        v0[j]=v1[i+j]=v2[i-j+n-1]=false;
    }
}

答案里还有一种方法,利用0和1的特性,直接定位可以放的地方,进一步优化。


程浩
21 声望2 粉丝

« 上一篇
51. N皇后