已知正整数n,即在一个nxn的棋盘上放置n个棋子,使每行每列和每条对角线上都只有一个棋子,返回有多少种摆法方法。保证n小于等于15。
例如当输入4时,对应的返回值为2,
对应的两种四皇后摆位如下图所示:
import java.util.*;
public class Queens {
public int nQueens(int n) {
Op op = new Op();
op.dfs(0,n);
return op.result;
}
static class Op{
boolean[] cols = new boolean[66];
boolean[] diag = new boolean[66];
boolean[] cdiag = new boolean[66];
int result ;
void dfs(int row,int n) {
if(row == n) {
++result;
return;
}
//尝试
for(int i=0;i< n;++i) {
if(cols[i]==false && diag[i+row+n] ==false && cdiag[i-row + n]==false) {
//这个列可以放
cols[i] = true;
diag[i+row+n] = true;
cdiag[i-row +n] = true;
dfs(row+1,n);
cols[i] = false;
diag[i+row+n] = false;
cdiag[i-row +n] = false;
}
}
}
}
} import java.util.*;
public class Queens {
public int nQueens(int n) {
if (n<0) return 0;
// write code here
int[] record = new int[n];
return process(0, record, n);
}
private int process(int i, int[] record, int n){
if (i == n)
return 1;
int res = 0;
for (int j=0; j<n; j++){
if (isValid(record, i, j)){
record[i] = j;
res += process(i+1, record, n);
}
}
return res;
}
private boolean isValid(int[] record, int i, int j){
for (int k=0; k<i; k++){
// 若在同一列或者对角线则返回false
if (j == record[k] || Math.abs(record[k] - j) == Math.abs(k - i)) return false;
}
return true;
}
}