您的位置:首页 > 产品设计 > UI/UE

【N皇后&DFS】N-Queens II

2014-04-19 13:34 537 查看
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
;
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
;
for(int i=0; i<n; i++) col[i] = 0;

dfs(0);
return count;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: