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的特性,直接定位可以放的地方,进一步优化。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。