package 递归.八皇后问题;
public class Queen8 {
//理论上8皇后问题需要一个二维数组,可是每个皇后一定不在同一行,所以我们定义一个一维数组就够了
//这里的数组下标表示第几行,数组下标对应的值表示第几列
private static int[] queen = new int[8];
//传入一个 n 表示第几个皇后,判断该皇后是否冲突
public static boolean judge(int n) {
//循环遍历之前的皇后,如果可行再返回true
for (int i = 0; i < n; i++) {
//1.queen[i] == queen[n]:因为数组下标对应的值表示所在列,所以此时表示同一列
//2.Math.abs():表示绝对值,这里表示斜率为1或者-1时,说明在一条斜线上
if (queen[i] == queen[n] || Math.abs(n - i) == Math.abs(queen[n] - queen[i])) {
return false;
}
}
//如果遍历了发现之前的没有冲突,就暂时为true
return true;
}
//加入皇后的方法
/**
* @param n:表示第几个皇后 当循环结束以后,我们会得到皇后所有的排序,因为每次第n个皇后找到位置时,他都会继续
* 调用一次addQueen方法。
*/
public static void addQueen(int n) {
//首先判断是否已经达到8个皇后
if (n == 8) {
//直接结束
show();
return;
} else {
//依次加入8个皇后
for (int i = 0; i < 8; i++) {
//第n个皇后寻找位置
queen[n] = i;
if (judge(n)) {
//如果为true,说明此时的皇后位置正确,那么我们就找下一个皇后的位置
addQueen(n + 1);
}
//如果为false,说明此刻的皇后还没找到位置呢,那我们继续遍历,等她找到就好了
}
}
}
//输出所有的可能性
public static void show() {
int[][] good = new int[8][8];
for (int i = 0; i < queen.length; i++) {
good[i][queen[i]] = 1;
}
for (int i = 0; i < good.length; i++) {
for (int j = 0; j < good[0].length; j++) {
if (good[i][j] == 1) {
System.out.printf("♛" + " ");
} else {
System.out.printf("☐" + " ");
}
}
System.out.println();
}
System.out.println("------------------------------------------");
}
}
JAVA实现八皇后问题解法
最新推荐文章于 2022-02-15 21:16:44 发布