java实现八皇后问题示例分享


当然,下面是一个使用Java实现的八皇后问题的示例代码。八皇后问题是一个经典的回溯算法问题,要求在一个8x8的棋盘上放置八个皇后,使得它们互不攻击。皇后能攻击同一行、同一列以及两个对角线上的其他皇后。


public class EightQueens {
    private static final int N = 8; // 棋盘大小
    private int[] queens = new int[N]; // 数组记录每行皇后的列位置

    public void solveNQueens() {
        placeQueen(0);
    }

    private void placeQueen(int row) {
        if (row == N) { // 所有皇后都放置成功
            printSolution();
            return;
        }

        for (int col = 0; col < N; col++) {
            if (isSafe(row, col)) {
                queens[row] = col; // 放置皇后
                placeQueen(row + 1); // 递归放置下一个皇后
                // 回溯,撤销当前皇后的放置
            }
        }
    }

    private boolean isSafe(int row, int col) {
        // 检查列上是否有皇后冲突
        for (int i = 0; i < row; i++) {
            if (queens[i] == col) {
                return false;
            }
        }

        // 检查左上方对角线是否有皇后冲突
        for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
            if (queens[i] == j) {
                return false;
            }
        }

        // 检查右上方对角线是否有皇后冲突
        for (int i = row - 1, j = col + 1; i >= 0 && j < N; i--, j++) {
            if (queens[i] == j) {
                return false;
            }
        }

        return true;
    }

    private void printSolution() {
        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) {
        EightQueens eq = new EightQueens();
        eq.solveNQueens();
    }
}

这段代码首先定义了一个`EightQueens`类,其中包含`solveNQueens`方法来启动解决过程,`placeQueen`方法用于递归地尝试在每一行放置皇后,`isSafe`方法用于检查在给定的行和列放置皇后是否安全,以及`printSolution`方法来打印一种解决方案。

请注意,由于八皇后问题有多个解,这段代码将输出所有可能的解决方案。每个解决方案之间由一行`---`分隔。