package backtrack;
/* 回溯法求n皇后问题
* 先以4皇后为例,最后求出的解空间存在一个数组x[4]中
* 要解决皇后问题还得编制一个限界函数place();
*/
public class BACKTRACK {
static int n=4;//这里可以修改皇后数目
static int[] x=new int[n];//存储解空间
public static void main(String[] args) {
// TODO Auto-generated method stub
x[0]=0;//第0个皇后放在第0列
int k=0;
while (k>=0){
x[k]=x[k]+1;
while(x[k]<n&&!place(k)){
x[k]=x[k]+1;
}
if(x[k]<n){
if(k==n-1){
System.out.println();
for(int i=0;i<n;i++){
System.out.print(x[i]+" ");
}
// return;
}else{
k=k+1;
x[k]=-1;
}
}
else{
k=k-1;//回溯
}
}
}
public static boolean place(int k){
int i=0;
while(i<k){
if(x[i]==x[k]||Math.abs(x[i]-x[k])==Math.abs(i-k)){
return false;
}
i=i+1;
}
return true;
}
}
回溯法的递归实现:
package backtrack;
/* 回溯法求n皇后问题
* 先以4皇后为例,最后求出的解空间存在一个数组x[4]中
* 要解决皇后问题还得编制一个限界函数place();
*/
public class RBACKTRACK {
static int n=4;//这里可以修改皇后数目
static int[] x=new int[n];//存储解空间
public RBACKTRACK(){
int k=0;
rbacktrack(k);
}
public static void rbacktrack(int k){
if(k==n){//递归出口
for(int i=0;i<n;i++){
System.out.print(x[i]+" ");
}
System.out.println();
return;
}
x[k]=0;//记得清零
while(x[k]<n){//记得在这里加while循环,这样才能够不断增加问题空间
if(place(k))
rbacktrack(k+1);
x[k]++;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
RBACKTRACK rb=new RBACKTRACK();
}
public static boolean place(int k){
int i=0;
while(i<k){
if(x[i]==x[k]||Math.abs(x[i]-x[k])==Math.abs(i-k)){
return false;
}
i=i+1;
}
return true;
}
}
