package 八皇后;
public class EightQueen {
private static final int QUEENNUM=8; //定义皇后数量为8
private static int[] queencols=new int[QUEENNUM];//定义一个数组 表示8列棋子皇后摆放的位置
private static int solvenum=0;//方案数
/**
*
* @param n 表示第n列
*/
public void getQueenSize(int n){
boolean [] nosize=new boolean[QUEENNUM];//记录每列的八个位置是否可以摆放 false可以 true不可以
for(int a=0;a<n;a++){
//遍历每列的每个位置是否可以摆放
nosize[queencols[a]]=true;
int d=n-a;
//正斜位置
if(queencols[a]-d>=0){
nosize[queencols[a]-d]=true;
}
//反斜位置
if(queencols[a]+d<=QUEENNUM-1){
nosize[queencols[a]+d]=true;
}
}
//到此知道了n+1列哪些位置不可摆放皇后
for(int b=0;b<QUEENNUM;b++){
if(nosize[b]){
//说明不能摆放
continue;
}
queencols[n]=b;//说明可以摆放 这一行很重要 即第n列的b行可以摆放
//比如第一次到此的时候 第一列b行可以摆放 就开始寻找第一个皇后摆放在第一列b行的方案
//逐渐缩小一直到n行b列方案确定 再扩大。
if(n<QUEENNUM-1){
getQueenSize(n+1);
}else{
solvenum++;
dyqueen();
}
}
}
public void dyqueen(){
System.out.println("第"+solvenum+"套方案:");
for(int i=0;i<QUEENNUM;i++){
for(int j=0;j<QUEENNUM;j++){
if(queencols[i] == j){
System.out.print("√ ");
}else{
System.out.print("✖ ");
}
}
System.out.println();
}
}
public static void main(String [] args){
EightQueen eq=new EightQueen();
eq.getQueenSize(0);
}
}
运行结果部分展示 √表示可以摆放 ✖表示不能摆放 一共92套方案
第1套方案:
√ ✖ ✖ ✖ ✖ ✖ ✖ ✖
✖ ✖ ✖ ✖ √ ✖ ✖ ✖
✖ ✖ ✖ ✖ ✖ ✖ ✖ √
✖ ✖ ✖ ✖ ✖ √ ✖ ✖
✖ ✖ √ ✖ ✖ ✖ ✖ ✖
✖ ✖ ✖ ✖ ✖ ✖ √ ✖
✖ √ ✖ ✖ ✖ ✖ ✖ ✖
✖ ✖ ✖ √ ✖ ✖ ✖ ✖
第2套方案:
√ ✖ ✖ ✖ ✖ ✖ ✖ ✖
✖ ✖ ✖ ✖ ✖ √ ✖ ✖
✖ ✖ ✖ ✖ ✖ ✖ ✖ √
✖ ✖ √ ✖ ✖ ✖ ✖ ✖
✖ ✖ ✖ ✖ ✖ ✖ √ ✖
✖ ✖ ✖ √ ✖ ✖ ✖ ✖
✖ √ ✖ ✖ ✖ ✖ ✖ ✖
✖ ✖ ✖ ✖ √ ✖ ✖ ✖
第91套方案:
✖ ✖ ✖ ✖ ✖ ✖ ✖ √
✖ ✖ √ ✖ ✖ ✖ ✖ ✖
√ ✖ ✖ ✖ ✖ ✖ ✖ ✖
✖ ✖ ✖ ✖ ✖ √ ✖ ✖
✖ √ ✖ ✖ ✖ ✖ ✖ ✖
✖ ✖ ✖ ✖ √ ✖ ✖ ✖
✖ ✖ ✖ ✖ ✖ ✖ √ ✖
✖ ✖ ✖ √ ✖ ✖ ✖ ✖
第92套方案:
✖ ✖ ✖ ✖ ✖ ✖ ✖ √
✖ ✖ ✖ √ ✖ ✖ ✖ ✖
√ ✖ ✖ ✖ ✖ ✖ ✖ ✖
✖ ✖ √ ✖ ✖ ✖ ✖ ✖
✖ ✖ ✖ ✖ ✖ √ ✖ ✖
✖ √ ✖ ✖ ✖ ✖ ✖ ✖
✖ ✖ ✖ ✖ ✖ ✖ √ ✖
✖ ✖ ✖ ✖ √ ✖ ✖ ✖