java用回溯法实现n皇后问题
时间: 2024-01-15 12:50:08 浏览: 25
以下是 Java 实现 N 皇后问题的回溯法代码:
```
public class NQueens {
private int[] queens; // 皇后所在列的数组
private int n; // 皇后数量
public NQueens(int n) {
this.queens = new int[n];
this.n = n;
}
// 在第 row 行放置皇后
private void placeQueen(int row) {
for (int col = 0; col < n; col++) {
if (isValid(row, col)) {
queens[row] = col;
if (row == n - 1) { // 所有皇后已经放置完毕
printQueens();
} else {
placeQueen(row + 1); // 放置下一行的皇后
}
}
}
}
// 判断在第 row 行 col 列放置皇后是否合法
private boolean isValid(int row, int col) {
for (int i = 0; i < row; i++) {
if (queens[i] == col) { // 同一列已经有皇后
return false;
}
if (Math.abs(row - i) == Math.abs(col - queens[i])) { // 在对角线上
return false;
}
}
return true;
}
// 打印皇后的位置
private void printQueens() {
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();
}
public static void main(String[] args) {
NQueens nQueens = new NQueens(4);
nQueens.placeQueen(0);
}
}
```
在这个实现中,我们使用一个数组 queens 来记录每个皇后所在的列。在 placeQueen 方法中,我们遍历每一列,判断当前位置是否合法,如果合法就将皇后放在该位置,并继续放置下一行的皇后。如果所有皇后都已经放置完毕,就打印出皇后的位置。如果当前位置不合法,就继续遍历下一列。在 isValid 方法中,我们判断当前位置是否与已经放置的皇后在同一列或同一条对角线上。如果是,就返回 false,否则返回 true。在 printQueens 方法中,我们打印出皇后的位置,用 Q 表示皇后,用 . 表示空格。在 main 方法中,我们创建一个 NQueens 对象,并调用 placeQueen 方法开始放置皇后。