n後問題的java實現(回溯法)
具體問題描述以及C/C++實現參見網址
http://blog.csdn.net/liufeng_king/article/details/8774394
/**
* n後問題--回溯法
* @author Lican
*
*/
public class Nqueen1 {
int n;//皇后個數
int[] x;//當前解
long sum;//當前已找到的可行方案數
public Nqueen1(int n){
this.n=n;
x=new int[n+1];
sum=0;
}
/**
* 限界函數
* @param k 第K層
* @return true(有解) false
*/
public boolean place(int k){
for(int j=1;j<k;j++){
if((Math.abs(j-k))==Math.abs(x[j]-x[k])||x[j]==x[k])//對角線衝突或者行衝突
return false;
}
return true;
}
public void backtrack(int t){
if(t>n){
sum++;
for(int i=1;i<=n;i++)
System.out.print(x[i]+" ");
System.out.println();
}
else{
for(int i=1;i<=n;i++){
x[t]=i;
if(place(t))//約束函數
backtrack(t+1);
}
}
}
public static void main(String[] args) {
int n=4;
Nqueen1 ns=new Nqueen1(n);
System.out.println("n後所在的位置分別爲:");
ns.backtrack(1);
System.out.println("當有"+n+"個皇后時,問題的解有"+ns.sum+"個");
}
}
/*
輸出:
n後所在的位置分別爲:
2 4 1 3
3 1 4 2
當有4個皇后時,問題的解有2個
*/