用java实现,采用回溯法求解n皇后问题
时间: 2023-06-27 20:05:01 浏览: 139
利用回溯法解决n皇后问题
好的,以下是采用回溯法求解 n 皇后问题的 Java 代码:
```java
public class NQueenProblem {
private int[] queens; // 保存皇后的列号,其下标表示行号
private int n; // 皇后个数
public NQueenProblem(int n) {
this.n = n;
queens = new int[n];
}
// 判断当前皇后摆放位置是否合法
private boolean isValid(int row, int col) {
for (int i = 0; i < row; i++) {
if (queens[i] == col || Math.abs(row - i) == Math.abs(col - queens[i])) {
return false;
}
}
return true;
}
// 回溯求解 n 皇后问题
private void backtrack(int row) {
// 找到一个可行解
if (row == n) {
printQueens();
return;
}
// 尝试在当前行的每一列上放置皇后
for (int col = 0; col < n; col++) {
if (isValid(row, col)) {
queens[row] = col;
backtrack(row + 1);
}
}
}
// 打印皇后的位置
private void printQueens() {
for (int row = 0; row < n; row++) {
for (int col = 0; col < n; col++) {
if (queens[row] == col) {
System.out.print("Q ");
} else {
System.out.print("* ");
}
}
System.out.println();
}
System.out.println();
}
public static void main(String[] args) {
NQueenProblem problem = new NQueenProblem(4);
problem.backtrack(0);
}
}
```
在 `NQueenProblem` 类中,我们首先定义了一个 `isValid` 方法,用于判断当前皇后摆放位置是否合法。具体来说,我们需要检查当前皇后是否与前面的皇后在同一列或同一斜线上。如果是,则说明当前位置不合法。
然后,我们定义了一个 `backtrack` 方法,用于回溯求解 n 皇后问题。在该方法中,我们首先判断是否找到了一个可行解。如果是,则打印当前皇后的位置。然后,我们尝试在当前行的每一列上放置皇后,并递归地调用 `backtrack` 方法来处理下一行。
最后,在 `main` 方法中,我们实例化了一个 `NQueenProblem` 对象,并调用 `backtrack` 方法来求解 n 皇后问题。
阅读全文