1、先将第一个皇后放在第一行第一列
2、将第二个皇后放在第二行第一列,看否冲突,若冲突,则依次放在第二列、第三列...遍历完后找到不冲突的位置
3、继续第三个皇后,直到所有皇后都找到合适的位置。
4、当得到一个正确解后,在回退到上一个栈,就开始进行回溯,即将第一个皇后在第一列的解全部得到。
5、然后回头继续将第一个皇后放第二列,后面循环2-4步。
package resursion;
public class Queen8 {
//定义一个max共有多少个皇后
int max = 8;
//定义一个数组,保存皇后的位置,例如{0,4,}
int[] array = new int[max];
//定义一个count共有多少种解法
static int count = 0;
public static void main(String[] args) {
// TODO Auto-generated method stub
Queen8 queen8 = new Queen8();
queen8.check(0);
System.out.printf("一共有%d种解法",count);
}
//开始摆放第n个皇后
public void check(int n) {
if(n == max) {
print();
return;
}
//测试将第n个皇后放在0-7个位置上,看是否冲突
for (int i = 0; i < max; i++) {
array[n] = i;
if(!judge(n)) {//false 不冲突
check(n+1);
}
//否则摆放第在1+i上测试
}
}
//判断存放第n个皇后时,是否与前n-1个皇后的位置冲突
public boolean judge(int n) {
for (int i = 0; i < n; i++) {
//array[i] == array[n]表示是不是同一列;
//Math.abs(n-i) == Math.abs(array[n]-array[i])表示是不是在同一斜线上
if(array[i] == array[n]||Math.abs(n-i) == Math.abs(array[n]-array[i])) {
return true;
}
}
return false;
}
//打印数组里的正确位置
public void print() {
count++;
for (int i = 0; i < max; i++) {
System.out.print(array[i]+" ");
}
System.out.println();
}
}