宝藏速成宝典(1)N皇后问题

224 阅读2分钟

一、 问题描述

        N皇后问题是一个经典的回溯算法问题,要求在一个N×N的棋盘上放置N个皇后,使得它们互相之间不会攻击到对方。皇后的攻击范围包括同一行、同一列和同一条对角线。

二、算法思想

       解决这个问题的一种常见方法是使用递归和回溯的思想。可以从第一行开始,逐行放置皇后,并使用一个数组来记录每一行皇后所在的列。当放置到第i行时,遍历该行的每一列,检查是否符合条件,如果符合则继续递归放置下一行的皇后,否则回溯到上一行继续尝试其他列的位置。

三、代码实现

解决N皇后问题的java代码如下:

public class NQueens {
    private int[] queens; // 存储皇后所在列的索引
    private int n; // 棋盘大小

    public NQueens(int n) {
        this.n = n;
        this.queens = new int[n];
    }

    public void solve() {
        if (placeQueens(0)) {
            printQueens();
        } else {
            System.out.println("无解");
        }
    }

    private boolean placeQueens(int row) {
        if (row == n) {
            return true; // 所有皇后都放置完成
        }

        for (int col = 0; col < n; col++) {
            if (isValid(row, col)) {
                queens[row] = col; // 在当前行的合法位置放置皇后

                // 递归放置下一行的皇后
                if (placeQueens(row + 1)) {
                    return true;
                }
            }
        }

        return false; // 无法在当前行放置皇后
    }

    private boolean isValid(int row, int col) {
        // 检查当前位置是否与已经放置的皇后冲突
        for (int i = 0; i < row; i++) {
            if (queens[i] == col || queens[i] - col == i - row || queens[i] - col == row - i) {
                return false;
            }
        }
        return true;
    }

    private void printQueens() {
        // 打印皇后的位置
        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();
        }
    }

    public static void main(String[] args) {
        int n = 8; // 棋盘大小
        NQueens nQueens = new NQueens(n);
        nQueens.solve();
    }
}

代码评价

       以上代码中,backtrack函数用于递归放置皇后,is_valid函数用于检查当前位置是否符合条件。程序最终返回一个List,其中每个元素是一个解决方案,每个解决方案是一个N×N的棋盘,其中Q代表皇后,.代表空白位置。

执行结果 

结语  

有了想法就去践行,不要怕出错

没什么大不了的,大不了重头再来过

!!!