[递归算法]八皇后(不确定正确性)

思路其实很简单,就是回朔,先看看这一行这个位置会不会和上面的后宫冲突,不行就退回上一层,可以就尝试下一层,下一层完成后就往右移一个

这个递归算法并不是最高效的,只是看上去很简单,有些变量基本上用不到,比如yPos,还有设为-1

统计八皇后布局数量(92个版本,也就是不考虑重复问题)

核心算法如下:

//八皇后的核心算法,不考虑括号的话一共13行,中间还有4行是赋值,赋值为-1还没什么用
public void findQueen(int[] xPos,int[] yPos,int level){

  if(level>=8){
    this.result++;
    return;
  }

  int xi=0;
  int yi=level;

  for(;xi<xPos.length;xi++){
    xPos[level]=xi;
    yPos[level]=yi;

    if(isValid(xPos,yPos,level))
      findQueen(xPos,yPos,level+1);

    xPos[level]=-1;
    yPos[level]=-1;
  }
}

//判断某一行的一个是否和上面的皇后冲突到
public boolean isValid(int[] xPos,int[] yPos,int level){
  for(int i=0;i<level;i++){

    if(xPos[i]==xPos[level])
      return false;

    if((xPos[i]-yPos[i]==xPos[level]-yPos[level])||((7-xPos[i])-yPos[i]==(7-xPos[level]-yPos[level])))
      return false;
  }

return true;
}

完整版如下:

public class EightQueen {
int[] xPos=new int[8];
int[] yPos=new int[8];

int result=0;

public EightQueen(){
for(int i=0;i<xPos.length;i++){
xPos[i]=-1;
yPos[i]=-1;
}

this.findQueen(xPos, yPos, 0);
//System.out.println("result="+result);
}


public void findQueen(int[] xPos,int[] yPos,int level){
//System.out.println(level);

if(level>=8){
this.result++;

String[][] flags=new String[8][8];


for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
flags[i][j]="O ";

for(int i=0;i<xPos.length;i++)
flags[xPos[i]][yPos[i]]="X ";


for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
System.out.print(flags[i][j]);
}
System.out.println();
}

System.out.println();

return;
}



int xi=0;
int yi=level;

for(;xi<xPos.length;xi++){
xPos[level]=xi;
yPos[level]=yi;

if(isValid(xPos,yPos,level)){
findQueen(xPos,yPos,level+1);
}


xPos[level]=-1;
yPos[level]=-1;
}
}

public boolean isValid(int[] xPos,int[] yPos,int level){
for(int i=0;i<level;i++){

if(xPos[i]==xPos[level])
return false;

if((xPos[i]-yPos[i]==xPos[level]-yPos[level])||((7-xPos[i])-yPos[i]==(7-xPos[level]-yPos[level]))){
return false;
}
}

return true;
}


public static void main(String[] args){
EightQueen a=new EightQueen();

}


}

原文地址:https://www.cnblogs.com/imakoo/p/3199224.html