用回溯法求解n后问题 java源代码
时间: 2024-03-31 08:14:18 浏览: 84
以下是使用回溯法求解n后问题的Java源代码:
```java
public class NQueens {
private static int[] queens;
public static void main(String[] args) {
int n = 8; // n代表棋盘的大小,也就是皇后的数量
queens = new int[n];
placeQueens(0, n);
// 输出最终的棋盘
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();
}
}
private static void placeQueens(int row, int n) {
// 如果已经摆放完了n个皇后,直接返回
if (row == n) {
return;
}
// 遍历每一列,尝试摆放皇后
for (int col = 0; col < n; col++) {
if (isValid(row, col)) {
queens[row] = col;
placeQueens(row + 1, n);
return;
}
}
// 如果无法摆放皇后,回溯到上一行
placeQueens(row - 1, n);
}
private static boolean isValid(int row, int col) {
for (int i = 0; i < row; i++) {
if (queens[i] == col || Math.abs(queens[i] - col) == row - i) {
return false;
}
}
return true;
}
}
```
该代码中,我们定义了一个长度为n的整型数组queens,用来存储每一行皇后所在的列号。placeQueens方法用来递归地摆放皇后,isValid方法用来判断当前位置是否可以摆放皇后。需要注意的是,isValid方法中的Math.abs(queens[i] - col) == row - i用来判断当前位置是否在同一对角线上。如果两个位置在同一对角线上,它们的行号之差等于列号之差。
阅读全文