13--递归【8皇后问题】
说明:理论上应该使用一个二维数组表示棋盘,但是其实可以用一个一维数组表示各个皇后放置的位置 -->
如:arr[8] = {0,4,7,5,2,6,1,3},取出任一元素表示arr[i] = val,表示的就是将第i+1个皇后【i从0开始】放置在i+1行的arr[i+1]列
1 public class Queen8Question {
2 //定义一个max表示共有多少个皇后
3 int max = 8;
4 int[] chess = new int[max];
5 static int count;
6 static int way;
7 public static void main(String[] args) {
8 Queen8Question q8 = new Queen8Question();
9 q8.setQueen(0);
10 System.out.println("判断了:" + count);
11 System.out.println("放置方式种类:" + way);
12 }
13
14 //打印棋盘
15 public void print() {
16 way++;
17 for(int i = 0; i < chess.length; i++) {
18 System.out.printf("%d ",chess[i]);
19 }
20 System.out.println();
21 }
22
23 //判断:当放置第n+1个皇后时【n从0开始】,与前边行数放置的皇后是否冲突【同一行、同一列、同一斜线】
24 public boolean judge(int n) {
25 count++;
26 for (int i = 0; i < n; i++) {
27 //chess[i] & chess[n]判断是否在同一列
28 //Math.abs(n-i) & Math.abs(chess[n] - chess[i])【可以理解为斜率的绝对值是否相等】【或者行差是否等于列差】
29 if (chess[i] == chess[n] || Math.abs(n - i) == Math.abs(chess[n] - chess[i])) {
30 return false;
31 }
32 }
33 return true;
34 }
35
36 //放置皇后,从0开始
37 public void setQueen(int n) {
38 if (n == max) {
39 print();
40 return;
41 }else {
42 for(int i = 0; i < max; i++) {
43 chess[n] = i;
44 if (judge(n)) { //不冲突
45 setQueen(n+1); //放置下个皇后
46 }
47 //如果冲突则放置当前行的下一列
48 }
49 }
50 }
51
52 }
种类较多,未全部展示~