首页 > 代码库 > 八皇后问题

八皇后问题

八皇后问题是个很经典的递归、迭代问题。解决思路就是只要保证所有皇后不在同一列和同斜线上。

假设就j,k为两个皇后所在的行 x[j]、x[k]表示两个皇后的位置。当两个皇后在同一列或同斜线上 可以用数学式子来表达|j-k|=|x[j]-x[k]|、x[j]=x[k]。所有当这两个条件不满足的时候问题就能解决。

解决方法一:递归法

private int n; //皇后个数
private int sum; //解的个数
private int x[]; //当前解
public EightQueens(){
  this.n=8;
  this.sum=0;
  this.x=new int [n+1];
}
/**
* 约定i表示行 x[i]表示位置
*/

public void jie(int t){
  if(t>n){/*如果t>n表示搜索到叶子节点 一次深度搜索结束*/
    sum++;
  }else{
    for(int i=1;i<=n;i++){
      x[t]=i;
      if(place(t)){
        jie(t+1);
       }
    }
  }
}
/**
* 判断函数,判断是否在一列上或者在同一条斜线上
* @param k
* @return
*/
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;
}

 运行结果 :92个

解决方法二:回溯

while(t>=1){
  x[t]=x[t]+1; //在下一列放置第k个皇后
  while(x[t]<=8&&!eightqueens.place(t)){
    x[t]=x[t]+1;//搜索下一列
  if(x[t]<=8&&t==8)//得到一个输出{
    eightqueens.sum++;
  }
  else if(x[t]<=8&&t<8)
    t=t+1;//放置下一个皇后
  else{
    x[t]=0;//重置x[k],回溯
    t=t-1;
  }
}

 运行结果 :92个

八皇后问题