6.7八皇后问题
package com.atguigu05.recursion;
/**
* @author peng
* @date 2021/11/18 - 14:32
*
* 使用递归解决八皇后问题
* 八皇后问题:
* 任意的两个皇后不能放置在同一行、同一列或者同一对角线上
*/
public class Queue8 {
//定义皇后的个数
int max = 8;
//定义一个数组用来存放皇后的位置,数组元素的下标表示皇后所在的行,数组元素的值表示皇后所在的列
int[] array = new int[max];
//定义静态count记录解法的个数
static int count;
public static void main(String[] args) {
Queue8 queue8 = new Queue8();
queue8.check(0);
System.out.println("八皇后问题一共有" + count + "种解法。");
}
/**
* 打印皇后的位置
*/
private void print() {
count++;
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + "\t");
}
System.out.println();
System.out.println("-------------------------------------");
}
/**
* 判断当前皇后的位置是否和之前放的皇后位置冲突
*/
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;
}
/**
* 编写一个方法放置第n个皇后
*/
private void check(int n) {
if (n == max) {
//说明此时放置的是第九个皇后,证明前面八个皇后已经放置好了
print();
return;
}
//放置第n个皇后
for (int i = 0; i < max; i++) {
//现将当前这个要放置的皇后,放置在该行的第一个位置
array[n] = i;
if (judge(n)) {
//接着判断该位置是否已经和前面皇后的位置冲突了
//如果不冲突,那么就继续放置下一个皇后
check(n + 1);
}
//如果当前位置已经和前面放置的皇后的位置冲突,那么就继续回到循环之中,将皇后放置在该行的下一个位置
}
}
}