采用优先队列式分支限界法求解4皇后问题的一个解 将一个4x4的棋盘用二维数组表示
,其中0表示空位,1表示皇后。
- 初始化优先队列,将初始状态(棋盘全为0)加入队列。
- 每次从队列中取出优先级最高的状态(即最少放置皇后的状态)。
- 对于该状态,依次尝试在每一列放置皇后,生成新的状态并加入队列中。
- 对于新生成的状态,检查是否符合规则(同行、同列、同对角线无重复皇后),不符合则舍弃。
- 如果新状态已经放置了4个皇后,则输出解并结束程序。
- 如果队列为空,则表示无解。
下面是Java代码实现:
import java.util.PriorityQueue;
public class NQueens {
static class State implements Comparable<State> {
int[][] board; // 棋盘状态
int queens; // 已放置皇后数量
int priority; // 优先级,即已放置皇后数量
public State(int[][] board, int queens) {
this.board = board;
this.queens = queens;
this.priority = queens;
}
@Override
public int compareTo(State o) { // 优先级比较器
return Integer.compare(this.priority, o.priority);
}
}
public static void main(String[] args) {
int[][] board = new int[4][4]; // 初始状态,棋盘全为0
PriorityQueue<State> queue = new PriorityQueue<>(); // 优先队列
queue.offer(new State(board, 0)); // 将初始状态加入队列
while (!queue.isEmpty()) {
State state = queue.poll(); // 取出优先级最高的状态
if (state.queens == 4) { // 如果已经放置了4个皇后,则输出解并结束程序
printBoard(state.board);
return;
}
for (int col = 0; col < 4; col++) { // 在每一列尝试放置皇后
if (isValid(state.board, state.queens, col)) { // 检查是否符合规则
int[][] newBoard = copyBoard(state.board); // 生成新状态
newBoard[state.queens][col] = 1; // 放置皇后
queue.offer(new State(newBoard, state.queens + 1)); // 加入队列
}
}
}
System.out.println("No solution found.");
}
private static boolean isValid(int[][] board, int row, int col) {
// 检查同列
for (int i = 0; i < row; i++) {
if (board[i][col] == 1) {
return false;
}
}
// 检查左上对角线
for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
if (board[i][j] == 1) {
return false;
}
}
// 检查右上对角线
for (int i = row - 1, j = col + 1; i >= 0 && j < 4; i--, j++) {
if (board[i][j] == 1) {
return false;
}
}
return true;
}
private static int[][] copyBoard(int[][] board) {
int[][] newBoard = new int[4][4];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
newBoard[i][j] = board[i][j];
}
}
return newBoard;
}
private static void printBoard(int[][] board) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
System.out.print(board[i][j] + " ");
}
System.out.println();
}
}
}
``
原文地址: https://www.cveoy.top/t/topic/d3Mv 著作权归作者所有。请勿转载和采集!