八皇后问题分析(回溯算法):
1.第一个皇后先放在第一行第一列
2.第二个皇后放在第二行第一列,然后判断是否与前面放置的皇后冲突,继续放在第二列,第三列,直到找到合适的。
3.继续第三个皇后,还是第一列,第二列…直到第八个皇后也放在一个合适的位置,到此,找到一个正确的解。
4.在得到一个正确的解时,就栈回退到上一个栈时,就开始回溯,将第一个皇后放在第一列的所有正确解得到。
5.然后继续讲第一个皇后放在第二列,第三列…继续执行1,2,3,4步骤。
public class BaHuangHou {
//max表示有几个皇后
int max=8;
/**
* 定义数组array,保存皇后放置位置的结果,比如:array{1,2,3},表示分别放在第一行第二列,
* 第二行第三列,第3行第四列
*/
int array[]=new int[max];
//计算一共有多少种结果
static int count=0;
public static void main(String[] args) {
BaHuangHou baHuangHou = new BaHuangHou();
baHuangHou.check(0);
System.out.println("一共有"+count+"种方法");
}
//放置第n个皇后
private void check(int n){
if (n==max){ //n=8时,8个皇后已经放好
print();
return;
}
//依次放入皇后,并判断是否冲突
for (int i = 0; i <max; i++) {
//把当前皇后放在该行的第i列
array[n]=i;
//判断第n个皇后放到第i列是否冲突
if (judge(n)){
//如果不冲突,继续放n+1个皇后,开始递归
check(n+1);
}
//如果冲突,将执行 array[n]=i,将该皇后放在该行后移的一个位置(i++)
}
}
//查看当前摆放的第n个皇后,是否和前面的有所冲突
private 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 false;
}
}
return true;
}
//输出皇后摆放位置输出
private void print(){
count++;
for (int i = 0; i <array.length ; i++) {
System.out.print(array[i]+" ");
}
System.out.println();
}
}
部分结果展示:一共有92种