java用回溯法实现n皇后问题
时间: 2024-01-15 13:41:31 浏览: 93
下面是Java实现N皇后问题的回溯法代码:
```java
public class NQueens {
public static void main(String[] args) {
int n = 8; // N皇后问题的规模
int[] queens = new int[n];
solve(queens, 0, n);
}
public static void solve(int[] queens, int row, int n) {
if (row == n) { // 找到了一组解
printQueens(queens);
return;
}
for (int i = 0; i < n; i++) {
queens[row] = i;
if (isValid(queens, row)) {
solve(queens, row + 1, n);
}
}
}
public static boolean isValid(int[] queens, int row) {
for (int i = 0; i < row; i++) {
if (queens[i] == queens[row] || Math.abs(queens[i] - queens[row]) == row - i) {
return false;
}
}
return true;
}
public static void printQueens(int[] queens) {
int n = queens.length;
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();
}
}
```
在这个代码中,`solve`方法是核心的回溯函数,它使用递归的方式来枚举每行中皇后的可能位置。在每一行中,我们尝试将皇后放置在每个位置上,并检查该位置是否合法。如果合法,就继续递归地解决下一行。如果我们到达最后一行,说明找到了一组解,就输出皇后摆放的位置。
`isValid`方法用于检查当前皇后的位置是否合法。我们只需要检查之前的每行中是否有皇后和当前皇后在同一列或同一对角线即可。
`printQueens`方法只是用来将皇后摆放的位置输出到控制台上,方便我们观察。
阅读全文