java解决八皇后问题
时间: 2023-10-11 21:21:22 浏览: 108
八皇后问题是指在8×8的国际象棋棋盘上放置八个皇后,使得任意两个皇后都不能互相攻击(即不能在同一行、同一列或同一斜线上)。下面是一种使用Java语言解决八皇后问题的代码实现:
```java
public class EightQueen {
private static int[] result = new int[8]; // 存放每个皇后所在的列
public static void main(String[] args) {
cal8queens(0);
}
private static void cal8queens(int row) {
if (row == 8) { // 8个皇后都已经放置好,输出结果
printQueens(result);
return;
}
for (int column = 0; column < 8; column++) { // 依次尝试每个列
if (isValid(row, column)) { // 如果该位置可以放置皇后,继续递归
result[row] = column;
cal8queens(row + 1);
}
}
}
private static boolean isValid(int row, int column) {
int leftUp = column - 1, rightUp = column + 1;
for (int i = row - 1; i >= 0; i--) { // 检查该列上方的每行
if (result[i] == column) return false; // 该列已经有皇后
if (leftUp >= 0 && result[i] == leftUp) return false; // 左上角已经有皇后
if (rightUp < 8 && result[i] == rightUp) return false; // 右上角已经有皇后
leftUp--;
rightUp++;
}
return true;
}
private static void printQueens(int[] result) {
for (int row = 0; row < 8; row++) {
for (int column = 0; column < 8; column++) {
if (result[row] == column) {
System.out.print("Q ");
} else {
System.out.print("* ");
}
}
System.out.println();
}
System.out.println();
}
}
```
在该代码中,`result`数组存放了每个皇后所在的列,`cal8queens`方法是递归调用的主要方法,它依次尝试每个列,如果该位置可以放置皇后,就将该皇后所在的列存入`result`数组,并继续递归下一行。`isValid`方法用于检查某个位置是否可以放置皇后,它检查该列上方的每行,以及左上角和右上角是否已经有皇后。`printQueens`方法用于输出结果。
阅读全文