,其中0表示空位,1表示皇后。

  1. 初始化优先队列,将初始状态(棋盘全为0)加入队列。
  2. 每次从队列中取出优先级最高的状态(即最少放置皇后的状态)。
  3. 对于该状态,依次尝试在每一列放置皇后,生成新的状态并加入队列中。
  4. 对于新生成的状态,检查是否符合规则(同行、同列、同对角线无重复皇后),不符合则舍弃。
  5. 如果新状态已经放置了4个皇后,则输出解并结束程序。
  6. 如果队列为空,则表示无解。

下面是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();
        }
    }
}
``
采用优先队列式分支限界法求解4皇后问题的一个解 将一个4x4的棋盘用二维数组表示

原文地址: https://www.cveoy.top/t/topic/d3Mv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录