Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.
求解法种数,使用DFS求排列和上一题的差不多
public class Solution {
public int n=0, count=0;
public int []col;
public void swap(int num[], int i, int j){
int t = num[i];
num[i] = num[j];
num[j] = t;
}
public boolean check(){
for(int i=0; i<n; i++){
for(int j=i+1; j<n; j++){
if(col[i] == col[j] || Math.abs(col[i]-col[j])==j-i) return false;
}
}
return true;
}
public void dfs(int pos){
if(pos == n){
if(check()){
count++;
}
return ;
}
for(int i=pos; i<n; i++){
swap(col, pos, i);
dfs(pos+1);
swap(col, pos, i);
}
}
public int totalNQueens(int n) {
this.n = n;
col = new int[n];
for(int i=0; i<n; i++) col[i] = i;
dfs(0);
return count;
}
}
解法二:在进行DFS前进行判断是否前面的摆放已经符合要求
public class Solution {
public int n=0, count=0;
public int []col;
public boolean check(int k){
for(int i=0; i<k; i++){//判断第k个节点前的皇后摆放是否正确
if(col[i] == col[k] || Math.abs(col[i]-col[k])==Math.abs(k-i)) return false;
}
return true;
}
public void dfs(int pos){
if(pos == n){
count++;
return ;
}
for(int i=0; i<n; i++){//可以摆放n个位置
col[pos] = i;
if(check(pos)){
dfs(pos+1);
}
}
}
public int totalNQueens(int n) {
this.n = n;
col = new int[n];
for(int i=0; i<n; i++) col[i] = 0;
dfs(0);
return count;
}
}