N皇后问题是一个经典的递归回溯问题。问题是在一个N×N的棋盘上放置N个皇后,使得它们不能互相攻击,即任何两个皇后都不在同一行、同一列或同一对角线上。
以下是N皇后问题的一个Java实现:
import java.util.Arrays;
public class NQueens {
// 使用一个一维数组来表示棋盘,索引表示行,值表示皇后所在的列
public static int[] board;
// 检查放置在(row, col)位置的皇后是否会受到攻击
public static boolean isSafe(int row, int col) {
for (int i = 0; i < row; i++) {
if (board[i] == col || Math.abs(board[i] - col) == Math.abs(i - row)) {
return false;
}
}
return true;
}
// 使用递归回溯来解决N皇后问题
public static boolean solveNQueens(int row, int N) {
if (row == N) { // 所有皇后都被安全放置
printSolution(N);
return true;
}
// 尝试在当前行的每一列放置皇后
for (int col = 0; col < N; col++) {
if (isSafe(row, col)) {
board[row] = col; // 放置皇后
if (solveNQueens(row + 1, N)) { // 递归放置下一行的皇后
return true;
}
// 如果放置下一行的皇后失败,则回溯
board[row] = -1;
}
}
return false; // 无法放置皇后,需要回溯
}
// 打印解决方案
public static void printSolution(int N) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (board[i] == j) {
System.out.print("Q ");
} else {
System.out.print(". ");
}
}
System.out.println();
}
System.out.println();
}
public static void main(String[] args) {
int N = 4; // 设置棋盘大小
board = new int[N];
Arrays.fill(board, -1); // 初始化棋盘
if (!solveNQueens(0, N)) { // 从第0行开始放置皇后
System.out.println("Solution does not exist");
}
}
}
在上述代码中:
board
数组用来存储解法,其中board[i]
表示第i
行的皇后放置在第board[i]
列。isSafe
方法用来判断在棋盘的(row, col)
位置放置皇后是否安全。solveNQueens
方法是一个递归方法,它尝试在每一行放置皇后,并在必要时进行回溯。printSolution
方法用来输出棋盘的一个解。- 在
main
方法中,我们初始化了一个大小为N
的棋盘,并尝试解决 N 皇后问题。
这个解法使用递归回溯策略来找到解决方案。每次递归调用会在新的一行尝试放置一个皇后,如果无法放置,则返回上一行重新尝试。
请注意,程序只会找到一个解决方案并打印出来。如果要找到所有可能的解决方案,可以修改 solveNQueens
方法,使之在找到一个解决方案后继续尝试,并收集所有解决方案。