Java实现n皇后
时间: 2023-09-15 22:22:27 浏览: 93
使用Java实现的N皇后问题
5星 · 资源好评率100%
好的,以下是Java中实现n皇后问题的示例代码:
```java
public class NQueens {
private int[] queens; // 用于存储每行皇后的列位置
private boolean[] usedCols; // 判断列是否被占用
private boolean[] usedDiag1; // 判断左对角线是否被占用
private boolean[] usedDiag2; // 判断右对角线是否被占用
private int n; // 皇后数量
// 构造函数
public NQueens(int n) {
this.n = n;
queens = new int[n];
usedCols = new boolean[n];
usedDiag1 = new boolean[2 * n - 1];
usedDiag2 = new boolean[2 * n - 1];
}
// 打印解决方案
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();
}
// 递归函数
private void dfs(int row) {
if (row == n) { // 找到一种解决方案
printSolution();
return;
}
// 依次枚举每列
for (int col = 0; col < n; col++) {
if (!usedCols[col] && !usedDiag1[row + col] && !usedDiag2[row - col + n - 1]) {
// 如果该列和对角线没有被占用,则可以放置皇后
queens[row] = col;
usedCols[col] = true;
usedDiag1[row + col] = true;
usedDiag2[row - col + n - 1] = true;
dfs(row + 1); // 继续递归下一行
// 回溯
queens[row] = 0;
usedCols[col] = false;
usedDiag1[row + col] = false;
usedDiag2[row - col + n - 1] = false;
}
}
}
// 求解函数
public void solve() {
dfs(0);
}
public static void main(String[] args) {
NQueens nQueens = new NQueens(4);
nQueens.solve();
}
}
```
输出结果为:
```
. Q . .
. . . Q
Q . . .
. . Q .
. . Q .
Q . . .
. . . Q
. Q . .
```
这里使用了回溯法来解决n皇后问题。具体来说,在dfs函数中,我们首先判断当前行的每一列是否可以放置皇后,然后递归处理下一行,如果下一行找到了解决方案,则打印输出;否则回溯到上一行重新放置皇后。在判断列和对角线是否被占用时,我们使用了三个boolean数组来存储,其中usedCols数组表示列是否被占用,usedDiag1和usedDiag2数组分别表示左对角线和右对角线是否被占用。
阅读全文