/**
* 回溯算法--八皇后问题:8行8列的矩阵
* Created by create on 2019/11/25.
*/
public class test03 {
public static void main(String [] args){
Queue q = new Queue();
q.cal8Queues(0);
System.out.println(q.count);
}
}
class Queue{
// result[i] = column 表示矩阵第i行的棋子放到了column列
int [] result = new int[8];
int count = 0; //记录解的个数
public void cal8Queues(int row){
if (row == 8){ //八枚棋子都已经放好了,直接打印结果
printQueue(result);
count ++;
return; //八行棋子都放置好了,无法继续递归了,return
}
//从第一行开始逐层往下放置棋子
for (int column = 0; column < 8; column++) {// 每一行都好8种方法
if(isok(row, column)){
//有些放法不满足要求,需要过滤掉
result[row] = column;
cal8Queues(row+1);//开始考察下一行棋子的存放位置
}
}
}
public void printQueue(int [] result){// 打印一个二维矩阵
for (int row = 0; row < 8; row++) {
for (int column = 0; column < 8; column++) {
if(result[row] == column){
System.out.print("Q ");
}else {
System.out.print("* ");
}
}
System.out.println();
}
System.out.println();
}
public boolean isok(int row, int column){ //判断第row行column列放置是否合适
int leftup = column - 1, rightup = column + 1;//左上对角线和右上对角线
for (int i = row - 1; i >= 0 ; --i) { //从当前行往上考察每一行
if (result[i] == column) return false; //第i行的第column列有棋子
if(leftup >= 0){ //考察第row行左上对角线,即第i行leftup列是否有棋子
if (result[i] == leftup) return false;
}
if(rightup <= 8){// 考察第row行左对角线。即第i行rightup列是否有棋子
if(result[i] ==rightup) return false;
}
-- leftup; ++ rightup;
}
return true;
}
}