今天自己实现了八皇后的问题,其实代码并不长,但是关于虚拟机中怎样实现的想了好长时间特别是红色部分。现在还是有点不是很明白。代码如下,已经实现运行。
public class EightQueen {
public static int sum = 0; //累计方法总数
public static final int MAXQUEEN = 8;//皇后个数,同时也是棋盘行列总数
public static int []columnForRow = new int[MAXQUEEN]; //定义数组,表示8列棋子摆放情况
public static void main(String[] args) {
placeQueue(0);
System.out.println();
System.out.println("共有"+sum+"走法。");
}
// 检查所放位子是否合法。
public static boolean check(int row){
boolean t=true;
for(int i=0;i<row;i++){
/*
* 放在同一列,绝对值=0;
* 放在对角线,绝对值=1;
* 放在斜对角线,绝对值=-1
**/
int diff=Math.abs(columnForRow[row]-columnForRow[i]);
if ((diff==0)||(diff==row-i)){
t=false;break;
}
}
return t;
}
// 放棋子的具体过程。
public static void placeQueue(int row){
<span style="color:#ff0000;">if(row==MAXQUEEN){
sum++;
printBoard();
return;
}</span>
for(int i=0;i<MAXQUEEN;i++){
columnForRow[row]=i;
if(check(row)){
placeQueue(row+1);
}
}
}
// 输出结果
public static void printBoard(){
System.out.println("第"+sum+"个走法:");
for(int i=0;i<MAXQUEEN;i++){
for(int j=0;j<MAXQUEEN;j++){
if(j!=columnForRow[i]){
System.out.print("+");
}else System.out.print("Q");
}System.out.println();
}
}
}