[递归算法]八皇后(不确定正确性)
思路其实很简单,就是回朔,先看看这一行这个位置会不会和上面的后宫冲突,不行就退回上一层,可以就尝试下一层,下一层完成后就往右移一个
这个递归算法并不是最高效的,只是看上去很简单,有些变量基本上用不到,比如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();
}
}
posted on 2013-07-18 20:27 TheKingOfKingFish 阅读(277) 评论(0) 编辑 收藏 举报