package algorithm.recursion;
/**
* @author AIMX_INFO
* @version 1.0
*/
public class Queue8 {
//定义max保存皇后的个数
static int max = 8;
//定义一维数组arr 保存皇后所在的位置,数组下标+1表示所在行,对应的值为所在的列
static int[] arr = new int[max];
public static void main(String[] args) {
//从第一个皇后开始放置
check(0);
}
//编写一个方法,放置第n个皇后
public static void check(int n){
if (n == max){
print();
return;
}
//依次放入皇后,并判断是否冲突
for (int i = 0; i < max; i++) {
//把当前这个皇后先放置到第一列
arr[n] = i;
//判断放置第n个皇后到第i列时是否冲突,如果不冲突,则放置下一个皇后
if (judge(n)){
check(n + 1);
}
//如果冲突,则将这个皇后放置到下一列
}
}
//编写方法判断第n个皇后和前边的皇后是否冲突
public static boolean judge(int n){
//遍历前n个皇后并判断
for (int i = 0; i < n; i++) {
//arr[i] == arr[n]判断是否在同一列
//Math.abs(n - 1) == Math.abs(arr[n] - arr[i])判断是否在对角线上
if (arr[i] == arr[n] || Math.abs(n - i) == Math.abs(arr[n] - arr[i])){
return false;
}
}
return true;
}
//编写方法显示合适的位置
public static void print(){
for (int i = 0; i < max; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
}
}
原文:https://www.cnblogs.com/mx-info/p/14826473.html