一、main方法
public static void main(String[] args) {
//八皇后问题,8个皇后放在8X8的棋盘上,要求8个皇后不能在同行,同列,也不能在同一斜线上
//思路,先在第一行摆一个皇后,再在第二行摆。。。直到第8行摆完,如果结果正确,再回到第七行,看能不能通过改变第七行,再改变第八行来产生
//生新的摆法,如果第7行不行,就回到第六行,看能不能通过改变第六行位置,产生新的摆法
Queen8 queen8 = new Queen8();
queen8.putQueen(0);
System.out.printf("共%d种解法", queen8.count);
}
//摆放皇后的方法,n-为第几个皇后([0,max))
public void putQueen(int m){
// 首先判断是否是第八个元素了,先判断终止条件
if(m==max){//说明前八个已经摆好了终止
print();//换行
return;
}
//如果通过就放下一个元素,如果通不过就调整当前皇后所在行的位置
for (int i = 0; i < max; i++) {
//先把皇后放在第一个位置
array[m] = i;
//如果通过就放下一个元素,如果通不过变化元素在的位置看能不能通过
if(judge(m)){
putQueen(m+1);
}
}
//再判断是否
}
//验证是否能摆放的判断
//判断在摆放第N个皇后时,是否会产生冲突
public boolean judge(int n){
//只需要判断是否和前n-1是否冲突
for (int j = 0; j <n ; j++) {
//同行基本上不用判断,只需要判断是否同列 array[i] == array[n]同列,Math.abs(array[n-i])==Math.abs(array[n]-array[i])同直线
if(array[j] == array[n] || Math.abs(n-j)==Math.abs(array[n]-array[j])){
return false;
}
}
// System.out.print(array[n]+"\t");
return true;
}
//写一个方法,可以将皇后摆放的位置输出
private void print(){
count++;
for (int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
System.out.println();
}