八皇后问题
要将八个皇后放在棋盘上,任何两个皇后都不能互相攻击。即没有两个皇后是在同一行、同一列或者同一对角上。
典型的八皇后问题,使用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){}
出现判断错误。