用java编写一个实验程序,采用分枝限界法求解4皇后问题的一个解
时间: 2024-03-02 11:49:56 浏览: 70
八皇后 的三种解法 (java编写)
4星 · 用户满意度95%
好的,以下是使用Java语言编写的4皇后问题求解程序,采用分枝限界法:
```java
public class NQueenProblem {
private static int N = 4; // 皇后数量
private static int[] board = new int[N]; // 存储棋盘
// 判断当前位置是否安全
private static boolean isSafe(int row, int col) {
// 检查列上是否有皇后
for (int i = 0; i < row; i++) {
if (board[i] == col) {
return false;
}
}
// 检查左上角是否有皇后
for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
if (board[i] == j) {
return false;
}
}
// 检查右上角是否有皇后
for (int i = row - 1, j = col + 1; i >= 0 && j < N; i--, j++) {
if (board[i] == j) {
return false;
}
}
return true;
}
// 分支限界法求解问题
private static boolean solveNQ(int row) {
// 所有皇后已经放置完成,返回true
if (row == N) {
return true;
}
// 尝试放置皇后
for (int col = 0; col < N; col++) {
if (isSafe(row, col)) {
board[row] = col;
// 递归下一行,如果成功,则返回true
if (solveNQ(row + 1)) {
return true;
}
// 如果失败,回溯
board[row] = -1;
}
}
// 所有列都尝试过,仍然无法放置皇后,返回false
return false;
}
// 打印棋盘
private static void printSolution() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (board[i] == j) {
System.out.print("Q ");
} else {
System.out.print(". ");
}
}
System.out.println();
}
}
public static void main(String[] args) {
// 初始化棋盘
for (int i = 0; i < N; i++) {
board[i] = -1;
}
// 求解问题
if (solveNQ(0)) {
printSolution();
} else {
System.out.println("No solution found!");
}
}
}
```
程序中使用了三个函数:
- `isSafe(int row, int col)`:判断当前位置是否安全;
- `solveNQ(int row)`:分支限界法求解问题;
- `printSolution()`:打印棋盘。
在 `main` 函数中初始化棋盘并调用 `solveNQ` 函数,如果求解成功则调用 `printSolution` 函数打印棋盘,否则输出错误信息。
阅读全文