在Java中实现N皇后问题,我们首先需要理解N皇后问题的基本定义:在N×N的棋盘上放置N个皇后,使得她们互不攻击,即任意两个皇后都不在同一行、同一列或同一对角线上。
下面是一个Java实现的简化版本,用于解决N皇后问题:
public class NQueens {
private int N;
private int[] queens; // 存储每行皇后的列位置
private int solutions = 0; // 解决方案的数量
public NQueens(int N) {
this.N = N;
queens = new int[N];
}
// 打印一个解决方案
private void printSolution() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (queens[i] == j) {
System.out.print("Q ");
} else {
System.out.print(". ");
}
}
System.out.println();
}
System.out.println();
}
// 检查在(row, col)位置放置皇后是否安全
private boolean isSafe(int row, int col) {
for (int i = 0; i < row; i++) {
if (queens[i] == col || // 检查列
Math.abs(queens[i] - col) == Math.abs(i - row)) { // 检查对角线
return false;
}
}
return true;
}
// 递归函数来放置皇后
private void solveNQUtil(int row) {
if (row == N) {
solutions++;
printSolution();
return;
}
for (int col = 0; col < N; col++) {
if (isSafe(row, col)) {
queens[row] = col;
solveNQUtil(row + 1);
// 回溯
queens[row] = -1;
}
}
}
// 解决N皇后问题的主函数
public void solveNQ() {
solveNQUtil(0);
System.out.println("Total solutions: " + solutions);
}
public static void main(String[] args) {
NQueens nQueens = new NQueens(4); // 例如,解决4皇后问题
nQueens.solveNQ();
}
}
### 代码解析
1. **类定义**:`NQueens` 类用于解决N皇后问题。
2. **成员变量**:
- `N`:棋盘的大小。
- `queens`:一个数组,用于存储每行皇后的列位置。
- `solutions`:记录解决方案的数量。
3. **方法**:
- `printSolution()`:打印一个解决方案。
- `isSafe(int row, int col)`:检查在`(row, col)`位置放置皇后是否安全。
- `solveNQUtil(int row)`:递归函数,用于放置皇后并调用自身来放置下一行的皇后。
- `solveNQ()`:解决N皇后问题的主函数,从第一行开始放置皇后。
- `main(String[] args)`:程序的入口点,创建`NQueens`对象并调用`solveNQ()`方法。
这个实现使用了回溯算法来尝试所有可能的皇后放置方式,并打印出所有有效的解决方案。