1 package 回溯;
2
3 public class 八皇后递归回溯 {
4
5 private int length; //皇后数量
6 private int sum; //总方案数
7 private int num[]; //存放皇后的一维数组
8
9 public 八皇后递归回溯() {
10 length = 8;
11 sum=0;
12 num = new int[length + 1];
13 }
14
15 public boolean check(int x) {
16 for (int i = 1; i < x; ++i) { //在一列,或对角线
17 if (num[x] == num[i]|| Math.abs(x - i) == Math.abs(num[x] - num[i]))
18 return false;
19 }
20 return true;
21 }
22
23 public void reback(int x) {
24 if (x > length) {
25 for (int i = 1; i <= length; ++i) {
26 System.out.print(num[i] + " ");
27 }
28 System.out.println();
29 sum++;
30 } else {
31 for (int i = 1; i <= length; ++i) {
32 num[x] = i;
33 if (check(x)) reback(x + 1); //第x个皇后找到位置,则继续第x+1个,i=1的方案完毕后继续i=2的方案
34 }
35 }
36 }
37
38 public static void main(String[] args) {
39 八皇后递归回溯 test=new 八皇后递归回溯();
40 test.reback(1);
41 System.out.println("共"+test.sum+"种方案");
42 }
43 }
回溯算法的原则:不进则退。讲搜索空间看成树,可采用深度优先、广度优先等策略进行搜索,上述所示八皇后采用深度优先策略