<pre name="code" class="java">
public class Queen8 {
public static int num = 0; //累计方案总数
public static final int MAXQUEEN = 4;//皇后个数,同时也是棋盘行列总数
public static int[] cols = new int[MAXQUEEN]; //定义cols数组,表示8列棋子摆放情况 cols[1]==1表示第一列的第一行有棋子
public Queen8() {
//核心函数
getArrangement(0);
System.out.println(MAXQUEEN+"皇后问题有"+num+"种摆放方法。");
}
public void getArrangement(int n){ //遍历第n列的棋子可能性
//遍历该列所有不合法的行,并用rows数组记录,不合法即rows[i]=true
boolean[] rows = new boolean[MAXQUEEN]; //默认为false
for(int i=0;i<n;i++){
rows[cols[i]]=true; //当前列N的棋子不能放在前面列m的棋子所在行
int d = n-i;
if(cols[i]-d >= 0){
rows[cols[i]-d]=true; //该句用于设置当前列N的棋子不能放在前面列m的棋子的斜线上
}
if(cols[i]+d <= MAXQUEEN-1) {
rows[cols[i]+d]=true; // 该句用于设置当前列N的棋子不能放在前面列m的棋子的反斜线上
}
}
for(int i=0;i<MAXQUEEN;i++){
if(rows[i])continue; //判断该行是否合法
cols[n] = i; //设置当前列合法棋子所在行数
if(n<MAXQUEEN-1){ //当前列不为最后一列时
getArrangement(n+1);
}else{
num++; //累计方案个数
printChessBoard(); //打印棋盘信息
}
}
}
public void printChessBoard(){
System.out.println("第"+num+"种走法 ");
for(int i=0;i<MAXQUEEN;i++){
for(int j=0;j<MAXQUEEN;j++){
if(i==cols[j]){
System.out.print("0 ");
}else
System.out.print("+ ");
}
System.out.println();
}
}
public static void main(String args[]){
Queen8 queen = new Queen8();
}
}