Java实现八皇后问题,用数组递归算法,简单易懂

时间:2021-05-11 04:13:10

八皇后问题

要将八个皇后放在棋盘上,任何两个皇后都不能互相攻击。即没有两个皇后是在同一行、同一列或者同一对角上。

典型的八皇后问题,使用Java写的算法,算法虽比较简单,但难免会有新手会犯疏漏和错误,希望大家可以批评指正,共同交流进步!

代码

@requires_authorization

public class Test {

public static void main(String[] args) {
Empress a=new Empress();
a.find(0);
System.out.println("八皇后问题共有:"+a.map+"种可能");
}
}

class Empress{
public int[][] arry=new int[8][8]; //棋盘,放皇后
public int map=0; //存储方案结果

public boolean rule(int arry[][],int k,int j){ //判断节点是否合适
for(int i=0;i<8;i++){ //行列冲突
if(arry[i][j]==1)
return false;
}
for(int i=k-1,m=j-1;i>=0&&m>=0;i--,m--){ //左对角线
if(arry[i][m]==1)
return false;
}
for(int i=k-1,m=j+1;i>=0&&m<=7;i--,m++){ //右对角线
if(arry[i][m]==1)
return false;
}
return true;
}


public void find(int i){ //寻找皇后节点
if(i>7){ //八皇后解
map++;
print();
return;
}
for(int m=0;m<8;m++){ //深度优先,递归算法
if(rule(arry,i,m)){
arry[i][m]=1;
find(i+1);
arry[i][m]=0;
}
}
}

public void print(){ //打印方法结果
System.out.print("方案"+map+":");
for(int i=0;i<8;i++){
for(int m=0;m<8;m++){
if(arry[i][m]==1){
System.out.print("皇后"+(i+1)+"在第"+i+"行,第"+m+"列\t");

}
}
}
System.out.println();
}
}

注意

在这个算法中,使用8X8数组来表示棋盘,元素赋值1代表存在一个皇后,0表示无。主要是要注意回溯过程中已舍弃的皇后代表的数组元素要置0,以免接下来继续使用深度优先搜索时,使用判断规则public boolean rule(int arry[][],int k,int j){}出现判断错误。