Java写一个n皇后算法
时间: 2024-05-13 16:20:44 浏览: 89
n皇后算法解读Java版和C++版对比-动力节点共16页
以下是Java实现n皇后算法的代码:
```java
public class NQueens {
private int n;
private int[] queens;
public NQueens(int n) {
this.n = n;
this.queens = new int[n];
}
public void solve() {
placeQueens(0);
}
private void placeQueens(int row) {
if (row == n) {
printQueens();
return;
}
for (int col = 0; col < n; col++) {
if (isSafe(row, col)) {
queens[row] = col;
placeQueens(row + 1);
}
}
}
private boolean isSafe(int row, int col) {
for (int i = 0; i < row; i++) {
int diff = Math.abs(col - queens[i]);
if (diff == 0 || diff == row - 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(8);
nQueens.solve();
}
}
```
在这个实现中,我们定义了一个`NQueens`类,它有两个实例变量:`n`表示棋盘的大小(即n x n),`queens`表示每行皇后所在的列号。
`solve`方法是算法的入口,它调用`placeQueens`方法来放置皇后。
`placeQueens`方法接受一个行号作为参数,当行号等于n时,表示所有皇后都已经放置好了,我们就可以打印出当前的解法。否则,我们在当前行的每个列上尝试放置皇后,如果放置后不会导致冲突,就递归调用`placeQueens`方法来放置下一行的皇后。
`isSafe`方法用来检查当前皇后的位置是否安全。我们遍历之前所有已经放置好的皇后,检查它们是否与当前皇后在同一列或同一条对角线上,如果是,就返回`false`,表示当前位置不安全。
`printQueens`方法用来打印当前的解法。
在`main`方法中,我们创建了一个`NQueens`对象,然后调用它的`solve`方法来解决n皇后问题。在这个例子中,我们设置了n=8,因此程序将打印出8皇后的所有解法。
阅读全文