八皇后问题简介
代码实现
public class Queen8 {
// 皇后的位置数组
private static int[] queen;
// 计算有多少种解法
private static int count;
// 棋盘的大小
private static int maxSize = 8;
public static void main(String[] args) {
// TODO Auto-generated method stub
// 初始化皇后数组
queen = new int[maxSize];
set(0);// 从第一行第一列的位置开始放皇后
System.out.printf("共有%d种解法:",count);
}
// 判断当前第n个皇后是否和前几个皇后位置冲突
public static boolean judge(int n) {
for (int i = 0; i < n; i++) {
// queen[i] == queen[n]表示判断 第n个皇后是否和前i个皇后在同一列
// Math.abs(n - i) == Math.abs(queen[n] - queen[i])表示判断 第n个皇后是否和前i个皇后在同一条斜线
if (queen[i] == queen[n] || Math.abs(n - i) == Math.abs(queen[n] - queen[i])) {
return false;
}
}
return true;
}
// 放置每一个皇后的位置
public static void set(int n) {
if (n == maxSize) {
// 已经放完了所有的皇后
// 打印解法 退出程序
print();
return;
}
for (int i = 0; i < queen.length; i++) {
// 将当前皇后放在i号位置
queen[n] = i;
// 判断当前第n个皇后是否和前i个皇后位置冲突
if (judge(n)) {
// 不冲突就放置第n+1个皇后
set(n + 1);
}
// 冲突则返回上边的for循环继续去i+1个位置放置皇后
}
}
// 打印八皇后的方法
public static void print() {
count++;
for (int i = 0; i < queen.length; i++) {
System.out.print(queen[i] + " ");
}
System.out.println();
}
}
递归学习到这就结束了 最后吐槽一句:谁发明的递归 理解起来也太抽象了吧……