n皇后问题 java
时间: 2023-08-13 18:11:11 浏览: 101
n皇后问题是一个经典的回溯算法问题,它的目标是在一个n×n的棋盘上放置n个皇后,使得每个皇后都不会互相攻击,即任意两个皇后都不在同一行、同一列和同一条对角线上。下面是Java语言实现n皇后问题的代码:
```java
public class NQueens {
private int[] queens; // 存放每行皇后所在的列数
private boolean[] rows; // 标记每行是否有皇后
private boolean[] diagonal1; // 标记正对角线是否有皇后
private boolean[] diagonal2; // 标记反对角线是否有皇后
private List<List<String>> result; // 存放所有合法的棋盘布局
public List<List<String>> solveNQueens(int n) {
queens = new int[n];
rows = new boolean[n];
diagonal1 = new boolean[2 * n - 1];
diagonal2 = new boolean[2 * n - 1];
result = new ArrayList<>();
backtrack(0, n);
return result;
}
private void backtrack(int row, int n) {
if (row == n) { // 找到一组合法的棋盘布局
List<String> board = new ArrayList<>();
for (int i = 0; i < n; i++) {
char[] rowChars = new char[n];
Arrays.fill(rowChars, '.');
rowChars[queens[i]] = 'Q';
board.add(new String(rowChars));
}
result.add(board);
} else {
for (int col = 0; col < n; col++) { // 枚举当前行皇后可以放置的列数
if (rows[row] || diagonal1[row + col] || diagonal2[row - col + n - 1]) {
continue; // 如果当前位置不合法,直接跳过
}
queens[row] = col;
rows[row] = true;
diagonal1[row + col] = true;
diagonal2[row - col + n - 1] = true;
backtrack(row + 1, n); // 继续放置下一行的皇后
queens[row] = 0;
rows[row] = false;
diagonal1[row + col] = false;
diagonal2[row - col + n - 1] = false;
}
}
}
}
```
该算法的时间复杂度为O(n^n),因为每个皇后都有n个选择,总共有n个皇后,所以时间复杂度为n^n。在实际应用中,n的范围比较小,该算法的效率是可以接受的。
阅读全文