Java 八皇后问题:回溯算法实现及代码解析
八皇后问题是一个经典的回溯算法问题,其目的是在一个 8x8 的棋盘上放置 8 个皇后,使得它们互不攻击。在 Java 中,可以使用递归函数和回溯算法来解决这个问题。以下是一种可能的 Java 代码实现:
public class EightQueens {
private static final int BOARD_SIZE = 8;
private static int[] columnForRow = new int[BOARD_SIZE];
public static void main(String[] args) {
placeQueens(0);
}
private static void placeQueens(int row) {
if (row == BOARD_SIZE) {
printBoard();
return;
}
for (int i = 0; i < BOARD_SIZE; i++) {
columnForRow[row] = i;
if (isValid(row)) {
placeQueens(row + 1);
}
}
}
private static boolean isValid(int row) {
for (int i = 0; i < row; i++) {
int diff = Math.abs(columnForRow[row] - columnForRow[i]);
if (diff == 0 || diff == row - i) {
return false;
}
}
return true;
}
private static void printBoard() {
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
if (j == columnForRow[i]) {
System.out.print('Q' + ' ');
} else {
System.out.print('. ' + ' ');
}
}
System.out.println();
}
System.out.println();
}
}
在这个实现中,我们使用了一个一维数组 columnForRow 来表示每一行中皇后所在的列数。在 placeQueens 函数中,我们首先判断当前行是否已经放置完毕,如果是,则打印棋盘并返回。否则,我们尝试在当前行中的每一列放置皇后,并检查是否符合规则。如果符合规则,则递归调用 placeQueens 函数来放置下一行的皇后。
在判断是否符合规则的 isValid 函数中,我们检查当前皇后所在的列数和之前的每一个皇后所在的列数是否相等,以及当前皇后和之前的每一个皇后是否在同一条对角线上。如果是,则说明当前位置不符合规则,返回 false。否则,返回 true。
最后,在打印棋盘的 printBoard 函数中,我们使用一个双重循环来遍历棋盘中的每一个格子,并根据当前格子是否有皇后来输出相应的字符。
运行这个程序,可以得到所有符合要求的八皇后解:
Q . . . . . . .
. . . . Q . . .
. . . . . . . Q
. . . . . Q . .
. . . . . . . .
. . . Q . . . .
. . . . . . Q .
. . Q . . . . .
Q . . . . . . .
. . . . . Q . .
. . . . . . . Q
. . . . Q . . .
. . . . . . Q .
. . . Q . . . .
. . . . . . . .
. . Q . . . . .
...(省略其它解)...
原文地址: https://www.cveoy.top/t/topic/mVNg 著作权归作者所有。请勿转载和采集!