java复习之递归+八皇后问题(二)
在8x8棋盘上,放皇后,任意两个皇后不能处于同一行,同一列,同一斜线,问多少方法?
第一个先放第一排第一列,
第二个放第二行第一列,进行判断,不符合就向后走,直到找到合适的,
继续第三个,直到第八个,这算找到一个正确的解,然后继续向后看其他位置行不行,不行就回溯到上一行,再看其他位置行不行,直到,回到第一行,继续向后走,执行上述步骤。
简化一点,可以只使用一个数组来做,用数组index作为行号,
上代码
package learn;
public class Queue8 {
private int max=8;
private int[] array = new int[8];
public static int num=0;
public void print(){
System.out.println();
for(int i=0;i<array.length;i++){
System.out.print(array[i]+"");
}
num++;
}
public boolean junge(int n){
for(int i=0;i<n;i++){
if(array[i]==array[n]||Math.abs(n-i)==Math.abs(array[n]-array[i])){//判断是否是在同列,斜行上
return false;
}
}
return true;
}
public void check(int n){
if(n==max){//此时n是第9个,结束check(),并打印
print();
return;
}
for(int i=0;i<max;i++){
array[n]=i;//n是行号也是皇后的个数位,i是列号,不用判断是否同行,因为只有一个 数组,必定是不同行的,
if(junge(n)){
check(n+1);
}
}
}
public static void main(String[] args) {
new Queue8().check(0);//0是第一皇后的位置
System.out.println(num);
}
}