回溯算法--八皇后问题

8x8 的棋盘,8 个棋子(皇后),每个棋子所在的行、列、对角线都不能有另一个棋子

//全局或成员变量,下标表示行,值表示queen存储在哪一列
    int[] result = new int[8];

    public void cal8queens(int row) {
        if (row == 8) {
            // 8个棋子都放置好了,打印结果
            printQueens(result);
            return;
        }
        // 每一行都有8中放法
        for (int column = 0; column < 8; ++column) {
            //判断是否满足要求
            if (isOk(row, column)) {
                // 第row行的棋子放到了column列
                result[row] = column;
                // 考察下一行
                cal8queens(row + 1);
            }
        }
    }

    ////判断row行column列放置是否合适
    private boolean isOk(int row, int column) {
        int leftup = column - 1, rightup = column + 1;
        // 逐行往上考察每一行
        for (int i = row - 1; i >= 0; --i) {
            //判断i行的column是否有。
            if (result[i] == column) {
                return false;
            }
            //判断左上对角线是否有
            if (leftup >= 0) {
                if (result[i] == leftup) {
                    return false;
                }
            }
            //判断右上对角线是否有
            if (rightup < 8) {
                if (result[i] == rightup) {
                    return false;
                }
            }
            --leftup;
            ++rightup;
        }
        return true;
    }

    private void printQueens(int[] result) { // 打印出一个二维矩阵
        for (int row = 0; row < 8; ++row) {
            for (int column = 0; column < 8; ++column) {
                if (result[row] == column) {
                    System.out.print("Q ");
                } else {
                    System.out.print("* ");
                }
            }
            System.out.println();
        }
        System.out.println();
    }

你可能感兴趣的:(回溯算法--八皇后问题)