1、基本介绍
2、应用实例(八皇后)
package recursion;
public class Queen8 {
private static int max = 8; // 指定皇后的数量
private static int count = 0;
private static int[] chessBoard = new int[max]; // 用一维数组代替棋盘,下标代表行 值代表列
public static void main(String[] args) {
check(0); // 从第一个皇后开始
System.out.println("一共有" + count + "种方法");
}
private static void check(int currQueen) {
if (currQueen == max) { // 当currQueen=8时,表示已得出一种解法
print();
return;
}
for (int i = 0; i < max; i++) { // 一共有max列
chessBoard[currQueen] = i; // 从第一列开始放皇后
if (!judge(currQueen)) { // 如果当前位置不冲突,则放下一个皇后
check(currQueen + 1);
}
// 如果当前位置冲突,则让i自增,尝试将当前皇后放在第2列,以此类推......
}
}
// 判断当前皇后是否处于恰当的位置
private static boolean judge(int currQueen) {
for (int i = 0; i < currQueen; i++) { // 判断当前皇后的位置,是否和前面皇后的位置是否有冲突
// 判断当前皇后是否与前面皇后所处同一列 或者 同一斜线(不用判断是否是同一行,dddd)
if (chessBoard[i] == chessBoard[currQueen] || Math.abs(currQueen - i) == Math.abs(chessBoard[currQueen] - chessBoard[i])) {
return true;
}
}
return false;
}
private static void print() {
count++;
for (int i = 0; i < chessBoard.length; i++) {
System.out.print(chessBoard[i] + " ");
}
System.out.println();
}
}